Jak zmusić nginx do przekazania nagłówka HTTP_X_FORWARDED_PROTO?

18

Opieram się na mojej konfiguracji

nginx > apache/php

do

haproxy > nginx > apache/php

(przy użyciu haproxy 1.5-dev18 z wkompilowaną obsługą ssl)

Zarówno nginx, jak i haproxy są poprawnie skonfigurowane, aby ustawić nagłówek HTTP_X_FORWARDED_PROTO. Jednak gdy nginx pobiera ruch ssl z haproxy, widzi połączenie jako http i ustawia nagłówek jako taki.

Jak ustawić nginx, aby przekazywał nagłówek HTTP_X_FORWARDED_PROTO, jeśli istnieje, ale w przeciwnym razie kontynuować ustawianie go w oparciu o połączenie?

Echo mówi Przywróć Monikę
źródło

Odpowiedzi:

36

Wymyśliłem, jak to rozwiązać. Problem polegał na tym, że nginx nadpisywał zestaw nagłówków przez haproxy w tym wierszu mojej konfiguracji:

proxy_set_header X-Forwarded-Proto $scheme;

Naprawiłem to, dodając w tym:

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

i zmiana wiersza proxy_set_header na nowy schemat:

proxy_set_header X-Forwarded-Proto $thescheme;
Echo mówi Przywróć Monikę
źródło
O ile mi czegoś nie brakuje, twoje przed i po proxy_set_headerwiersze są takie same.
Wilfred Hughes,
1
$schemevs $thescheme.
Arlen Beiler
Czy w niektórych rzadkich przypadkach nie jest to niebezpieczne? Jeśli przeglądarka internetowa wysyła żądanie HTTP do haproxy, a haproxy następnie wysyła żądanie HTTPS do Nginx - wtedy default $schemetak się stanie, ustawienie $theschemeHTTPS, chociaż w rzeczywistości żądanie (do haproxy) nie jest bezpieczne HTTP. - Aby tego uniknąć, co z default $http_x_forwarded_proto; '' $scheme;:, więc jeśli haproxy mówi HTTP, to będzie przestrzegane.
KajMagnus
Sugeruje się to tutaj: stackoverflow.com/a/21911864/694469 (tj default $http_x_forwarded_proto;.).
KajMagnus
2

Taką samą potrzebę miałem z AWS ELB

Oto moja linia rozwiązywania:

proxy_set_header        X-Forwarded-Proto $http_x_forwarded_proto;
jobwat
źródło
Czy powinienem postawić $http_x_forwarded_protogdzieś? Co to jest?
Jonathan
developer.mozilla.org/en-US/docs/Web/HTTP/Headers/… $ http_x_forwarded_proto jest implementacją
NGINX
2
Odpowiadasz właśnie rozwiązany problem, w który wbijam młot od 3 dni! Co drugi post na temat równoważenia obciążenia aws z adwokatem https proxy_set_header X-Forwarded-Proto $scheme;, co nie działa
MikeMarsian
1

Nie mogę tak po prostu komentować, więc zamieszczam to jako odpowiedź: Czy możesz podać nam część lub całość swojej konfiguracji nginx, abyśmy mogli zobaczyć, co jest z nią nie tak? Być może twoja konfiguracja HAProxy też?

Pierwszym problemem, jaki mogę wymyślić, jest to, że twój HAProxy robi zakończenie SSL. Podsumowując, aby odciążyć serwery zaplecza, moduł równoważenia obciążenia można skonfigurować tak, aby wykonywał wszystkie czynności związane z ssl, a następnie komunikował się z serwerami zaplecza za pomocą protokołu HTTP. Podobnie jak schemat tutaj: http://blog.exceliance.fr/2012/09/10/how-to-get-ssl-with-haproxy-getting-rid-of-stunnel-stud-nginx-or-pound/

Aby dać ci dobrą odpowiedź na twoje pytanie, czy możesz sprawdzić, czy nie masz żadnych problemów z zapętleniem w konfiguracji http <> https? Może wtedy możesz przekierować http na http, https na https, a następnie wymusić przekierowanie http na https.

Czy możesz również sprawdzić, czy masz włączone przekazywanie SSL w konfiguracji HAProxy?

Yannovitch
źródło
Czy rozwiązałeś swój problem?
Yannovitch
1
Rozgryzłem to. Twoja odpowiedź nie pomogła bezpośrednio, ale ten drugi link pomógł mi znaleźć sposób na rozwiązanie tego problemu. Dzięki.
Echo mówi Przywróć Monikę