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 використовується з аргументом додавання, додавання або встановлення, четвертий аргумент може бути використаний для визначення умов, за яких буде здійснено дію. Якщо змінна середовища, вказана в аргументі env = ..., існує (або якщо змінна середовища не існує, а env =! ... вказана), дія, визначена директивою RequestHeader, набере чинності. В іншому випадку директива не матиме впливу на запит.

Хоча змінна середовище HTTPS встановлюється лише тоді, коли запит робиться через SSL.


3
Відповідно до en.wikipedia.org/wiki/List_of_HTTP_header_fields в заголовку повинні бути дефіси, а не підкреслення: RequestHeader встановлює 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директив.


1
Як я можу налагодити, чи справді апач надсилає цей заголовок?
codecowboy

2

Знайшов причину. Виявляється, це порядок видачі операцій. mod_rewrite відповідає за надання цих змінних середовища, але Apache не обробляє його, поки ПІСЛЯ не обробляє будь-які запити ProxyPass. До цього часу він просто встановить нуль. Єдине вирішення проблеми полягає в тому, щоб зробити проксінг через mod_rewrite.

Див. Http://www.gossamer-threads.com/lists/apache/users/267160?do=post_view_threaded#267160

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.