Как заставить 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;
jobwat
источник
Должен ли я сделать ставку $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?

Yannovitch
источник
Вы решили свою проблему?
Яннович
1
Я понял. Ваш ответ не помог напрямую, но эта вторая ссылка помогла мне найти способ ее решить. Благодарю.
Эхо говорит восстановить Monica