Wie kann Nginx den HTTP_X_FORWARDED_PROTO-Header weiterleiten?


18

Ich ändere mein Setup von

nginx > apache/php

zu

haproxy > nginx > apache/php

(mit haproxy 1.5-dev18 mit ssl-unterstützung kompiliert in)

Sowohl nginx als auch haproxy sind richtig eingerichtet, um den HTTP_X_FORWARDED_PROTO-Header festzulegen. Wenn nginx jedoch den SSL-Datenverkehr von haproxy erhält, wird die Verbindung als http angezeigt und der Header als so festgelegt.

Wie kann ich nginx so einstellen, dass der HTTP_X_FORWARDED_PROTO-Header weitergeleitet wird, wenn er vorhanden ist, aber ansonsten basierend auf der Verbindung weiter festgelegt wird?

Antworten:


36

Ich habe herausgefunden, wie ich das lösen kann. Das Problem war, dass nginx den von haproxy gesetzten Header in dieser Zeile meiner Konfiguration überschrieb:

proxy_set_header X-Forwarded-Proto $scheme;

Ich habe es behoben, indem ich Folgendes hinzufügte:

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

und Ändern der Zeile proxy_set_header, um das neue Schema zu verwenden:

proxy_set_header X-Forwarded-Proto $thescheme;

Sofern ich nichts vermisse, sind Ihre vor und nach proxy_set_headerZeilen gleich.
Wilfred Hughes

1
$schemevs $thescheme.
Arlen Beiler,

Ist das nicht in seltenen Fällen unsicher? Wenn ein Webbrowser eine HTTP-Anfrage an haproxy sendet und haproxy dann eine HTTPS-Anfrage an Nginx sendet, wird der default $schemeFall eintreten und $theschemeauf HTTPS gesetzt, obwohl die Anfrage (an haproxy) tatsächlich unsicheres HTTP ist. - Um dies zu vermeiden, wie default $http_x_forwarded_proto; '' $scheme;wäre es mit:, wenn haproxy HTTP sagt, wird es respektiert.
KajMagnus

Dies wird hier vorgeschlagen: stackoverflow.com/a/21911864/694469 (ie default $http_x_forwarded_proto;).
KajMagnus

2

Ich hatte das gleiche Bedürfnis mit AWS ELB

Hier ist meine Lösungslinie:

proxy_set_header        X-Forwarded-Proto $http_x_forwarded_proto;

Soll ich $http_x_forwarded_protoirgendwo setzen? Was ist das?
Jonathan

developer.mozilla.org/en-US/docs/Web/HTTP/Headers/… $ http_x_forwarded_proto ist die NGINX-Implementierung
jobwat

2
Du hast gerade ein Problem gelöst, auf das ich seit 3 ​​Tagen gehämmert habe! Jeder zweite Beitrag zum Thema aws Load Balancer mit https advocate proxy_set_header X-Forwarded-Proto $scheme;, der nicht funktioniert
MikeMarsian

1

Ich kann nicht einfach einen Kommentar abgeben, also poste ich dies als Antwort: Können Sie uns einen Teil oder die gesamte Nginx-Konfiguration geben, damit wir sehen können, was daran falsch ist? Möglicherweise auch Ihre HAProxy-Konfiguration?

Das erste Problem, das mir einfällt, ist, dass Ihr HAProxy eine SSL-Kündigung durchführt. Um es zusammenzufassen, um Ihre Back-End-Server auszulagern, kann ein Load Balancer so konfiguriert werden, dass er alle SSL-Vorgänge ausführt und dann über HTTP mit Ihren Back-End-Servern kommuniziert. Wie das Schema hier: http://blog.exceliance.fr/2012/09/10/how-to-get-ssl-with-haproxy-getting-rid-of-stunnel-stud-nginx-or-pound/

Können Sie überprüfen, ob in Ihrer http <> https-Konfiguration kein Loopback-Problem vorliegt, um eine gute Antwort auf Ihre Frage zu erhalten? Vielleicht können Sie dann http zu http, https zu https umleiten und dann erzwingen, dass http zu https umgeleitet wird.

Könnten Sie auch überprüfen, ob Sie SSL-Passthrough in Ihrer HAProxy-Konfiguration aktiviert haben?


Haben Sie Ihr Problem gelöst?
Yannovitch

1
Ich habe es herausgefunden. Ihre Antwort hat nicht direkt geholfen, aber dieser zweite Link hat mir geholfen, einen Weg zu finden, um ihn zu lösen. Vielen Dank.
Echo sagt Reinstate Monica
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.