У меня Apache настроен как балансировщик нагрузки. Я хотел, чтобы apache установил заголовок X-Forwarded-Proto, но это не работает:
RequestHeader set X-Forwarded-Proto "%{SERVER_PROTOCOL}e"
Заголовок становится равным нулю. Есть идеи, почему?
Поздно, но все же я только что столкнулся с той же проблемой, и это сработало для меня:
RequestHeader set X_FORWARDED_PROTO 'https' env=HTTPS
В документация говорит:
Когда директива RequestHeader используется с аргументом add, append или set, четвертый аргумент может использоваться для указания условий, при которых будет выполняться действие. Если переменная среды, указанная в аргументе env = ..., существует (или если переменная среды не существует и указано env =! ...), то действие, указанное в директиве RequestHeader, вступит в силу. В противном случае директива не повлияет на запрос.
В то время как переменная среды HTTPS устанавливается только тогда, когда запрос выполняется через SSL.
Вы этого не хотите; он установил бы ваш заголовок на «HTTP / 1.1» (даже в запросе https) - вероятно, не очень полезно для того, что вы передаете.
У вас разные блоки VirtualHost для http и https; просто жестко закодируйте RequestHeader
настройка в каждом.
<VirtualHost *:80>
RequestHeader set X-Forwarded-Proto "http"
...
</VirtualHost>
<VirtualHost *:443>
RequestHeader set X-Forwarded-Proto "https"
...
</VirtualHost>
Вы можете исправить это, используя early
ключевое слово:
RequestHeader set X-Forwarded-Proto "https" early
В противном случае вы можете сделать то, что предложил Джон Креншоу, а именно использовать RewriteRule
вместо того ProxyPass
директивы.
Нашел причину. Оказывается, это вопрос порядка работы. mod_rewrite отвечает за предоставление этих переменных среды, но Apache не обрабатывает их, пока ПОСЛЕ обработки любых запросов ProxyPass. А до тех пор он просто установит null. Единственный обходной путь, похоже, - проксировать через mod_rewrite.
Видеть http://www.gossamer-threads.com/lists/apache/users/267160?do=post_view_threaded#267160