Как заставить nginx переслать заголовок HTTP_X_FORWARDED_PROTO?


18

Я проверяю свою настройку из

nginx > apache/php

в

haproxy > nginx > apache/php

(используя haproxy 1.5-dev18 с скомпилированной поддержкой ssl)

И nginx, и haproxy настроены правильно, чтобы установить заголовок HTTP_X_FORWARDED_PROTO. Однако, когда nginx получает трафик ssl от haproxy, он видит соединение как http и устанавливает заголовок как таковой.

Как я могу настроить nginx для пересылки заголовка HTTP_X_FORWARDED_PROTO, если он существует, но в противном случае продолжить его настройку в зависимости от соединения?

Ответы:


36

Я разобрался, как это решить. Проблема была в том, что nginx перезаписывал заголовок, установленный haproxy, в этой строке моего конфига:

proxy_set_header X-Forwarded-Proto $scheme;

Я исправил это, добавив в это:

map $http_x_forwarded_proto $thescheme {
     default $scheme;
     https https;
 }   

и изменив строку proxy_set_header для использования новой схемы:

proxy_set_header X-Forwarded-Proto $thescheme;

Если я что-то упустил, ваши proxy_set_headerстроки до и после совпадают.
Уилфред Хьюз

1
$schemeпротив $thescheme.
Арлен Бейлер

Разве это не в некоторых редких случаях небезопасно? Если веб-браузер отправляет HTTP-запрос haproxy, а haproxy затем отправляет HTTPS-запрос в Nginx - тогда это default $schemeпроизойдет, если установить $theschemeHTTPS, хотя на самом деле запрос (к haproxy) является небезопасным HTTP. - Чтобы избежать этого, как насчет:, default $http_x_forwarded_proto; '' $scheme;так что если haproxy говорит HTTP, это будет соблюдаться.
КаджМагнус

Это предлагается здесь: stackoverflow.com/a/21911864/694469 (т.е. default $http_x_forwarded_proto;).
КаджМагнус

2

У меня была такая же потребность с AWS ELB

Вот моя решающая линия:

proxy_set_header        X-Forwarded-Proto $http_x_forwarded_proto;

Должен ли я сделать ставку $http_x_forwarded_protoгде-нибудь? Это что?
Джонатан

developer.mozilla.org/en-US/docs/Web/HTTP/Headers/… $ http_x_forwarded_proto - это реализация NGINX
jobwat

2
Вы отвечаете только что решил проблему, над которой я в течение 3 дней! Каждый второй пост на тему балансировки нагрузки aws с адвокат https proxy_set_header X-Forwarded-Proto $scheme;, который не работает
MikeMarsian

1

Я не могу просто комментировать, поэтому я публикую это как ответ: не могли бы вы дать нам часть или всю вашу конфигурацию nginx, чтобы мы могли увидеть, что с ней не так? Возможно ваш конфиг HAProxy тоже?

Первая проблема, о которой я могу подумать, заключается в том, что ваш HAProxy выполняет ssl-завершение. Подводя итог, можно сказать, что для разгрузки ваших внутренних серверов балансировщик нагрузки может быть настроен на выполнение всех операций ssl, а затем на связь с вашими внутренними серверами по протоколу HTTP. Как схема здесь: http://blog.exceliance.fr/2012/09/10/how-to-get-ssl-with-haproxy-getting-rid-of-stunnel-stud-nginx-or-pound/

Чтобы дать вам хороший ответ на ваш вопрос, не могли бы вы проверить, что в вашей конфигурации http <> https нет петлевой проблемы? Возможно, тогда вы могли бы перенаправить http на http, https на https, а затем принудительно перенаправить http на https.

Не могли бы вы также проверить, что вы включили ssl passthrough в вашей конфигурации HAProxy?


Вы решили свою проблему?
Яннович

1
Я понял. Ваш ответ не помог напрямую, но эта вторая ссылка помогла мне найти способ ее решить. Благодарю.
Эхо говорит восстановить Monica
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.