RequestHeader с переменной окружения Apache

13

У меня Apache настроен как балансировщик нагрузки. Я хотел, чтобы apache установил заголовок X-Forwarded-Proto, но это не работает:

RequestHeader set X-Forwarded-Proto "%{SERVER_PROTOCOL}e"

Заголовок устанавливается равным нулю. Есть идеи почему?

Джон Креншоу
источник

Ответы:

15

Поздно, но все же, я только что рассмотрел ту же проблему, и это сработало для меня:

RequestHeader set X_FORWARDED_PROTO 'https' env=HTTPS

Документация говорит:

Когда директива RequestHeader используется с аргументом add, append или set, четвертый аргумент может использоваться для указания условий, при которых будет выполнено действие. Если переменная окружения, указанная в аргументе env = ..., существует (или если переменная окружения не существует и задано env =! ...), то действие, указанное в директиве RequestHeader, вступит в силу. В противном случае директива не будет влиять на запрос.

В то время как переменная окружения HTTPS устанавливается только тогда, когда запрос сделан через SSL.

iNecas
источник
3
Согласно en.wikipedia.org/wiki/List_of_HTTP_header_fields, заголовок должен содержать дефисы, а не подчеркивания: RequestHeader set X-Forwarded-Proto 'https' env = HTTPS Это также заголовок, который отправляет ELB Amazon.
loevborg
9

Вы не хотите этого; он установил бы ваш заголовок на «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>
Шейн Мэдден
источник
1
Это все еще не отвечает на вопрос, почему переменные среды не работают. Я также хотел сохранить порт и некоторые другие значения, некоторые из которых не могут быть жестко запрограммированы, как это.
Джон Креншоу
3

Вы можете исправить это, используя earlyключевое слово:

RequestHeader set X-Forwarded-Proto "https" early

В противном случае вы можете сделать то, что предложил Джон Креншоу, а именно использовать RewriteRuleвместо ProxyPassдиректив.

docwhat
источник
1
Как я могу отладить, действительно ли apache отправляет этот заголовок?
codecowboy
2

Нашел причину. Оказывается, это вопрос порядка операций. mod_rewrite отвечает за предоставление этих переменных среды, но Apache не обрабатывает их, пока ПОСЛЕ ТОГО, как он обрабатывает любые запросы ProxyPass. До тех пор он просто установит ноль. Единственный обходной путь, по-видимому, заключается в том, чтобы сделать проксирование через mod_rewrite.

См. Http://www.gossamer-threads.com/lists/apache/users/267160?do=post_view_threaded#267160

Джон Креншоу
источник