web-dev-qa-db-ger.com

Realer Gebrauch des X-Forwarded-Host-Headers?

Ich habe einige interessante Informationen zu den X-Forwarded-*-Headern gefunden, darunter den Abschnitt Reverse Proxy Request Headers in der Apache-Dokumentation sowie den Wikipedia-Artikel zu X-Forwarded-For .

Ich verstehe das:

  • X-Forwarded-For gibt die Adresse des Clients an, der mit dem Proxy verbunden ist
  • X-Forwarded-Port gibt den Port an, mit dem der Client auf dem Proxy verbunden ist (z. B. 80 oder 443).
  • X-Forwarded-Proto gibt das Protokoll an, mit dem der Client eine Verbindung zum Proxy herstellt (http oder https)
  • X-Forwarded-Host gibt den Inhalt des Host-Headers an, den der Client an den Proxy gesendet hat.

Das alles macht Sinn.

Ich kann jedoch noch immer keinen echten Anwendungsfall von X-Forwarded-Host herausfinden. Ich verstehe die Notwendigkeit, die Verbindung an einem anderen Port oder unter Verwendung eines anderen Schemas zu wiederholen, aber Warum würde ein Proxyserver den Header Host ändern, wenn er die Anforderung an den Zielserver wiederholt?

43
Benjamin

Wenn Sie einen Frontend-Dienst wie Apigee als Frontend für Ihre APIs verwenden, benötigen Sie etwas wie X-FORWARDED-Host, um zu verstehen, mit welchem ​​Hostnamen eine Verbindung zur API hergestellt wurde, da Apigee mit konfiguriert wird Was auch immer Ihr Backend-DNS ist, nginx und Ihr App-Stack sehen nur den Hostheader als Ihren Backend-DNS-Namen und nicht den Hostnamen, der an erster Stelle aufgerufen wurde.

22
Bryan Rehbein

Ich kann Ihnen ein echtes Problem mitteilen, ich hatte ein Problem mit einem IBM Portal.

In meinem Fall bestand das Problem darin, dass das IBM Portal über einen Rest-Service verfügt, der eine URL für eine Ressource abruft, etwa: {"Url": " http://internal.Host.name/path " }

Was ist passiert? Ganz einfach: Wenn Sie aus dem Intranet kommen, funktioniert alles einwandfrei, da internalHostName vorhanden ist. Wenn der Benutzer jedoch aus dem Internet kommt, kann der Proxy den Hostnamen nicht auflösen und das Portal stürzt ab.

Der Fix für das IBM Portal bestand darin, den Header X-FORWARDED-Host zu lesen und die Antwort in etwas zu ändern: {"Url": " http://internet.Host.name/path " }

Sehen Sie, dass ich Internet und nicht intern in die zweite Antwort stelle.

8
Carlos Verdes

An diesem Szenario habe ich heute gearbeitet: Benutzer greifen auf bestimmte Anwendungsserver über die URL " https://neaturl.company.com " zu, die auf Reverse Proxy verweist. Der Proxy beendet dann SSL und leitet die Anforderungen der Benutzer an den eigentlichen Anwendungsserver mit der URL " http://192.168.1.1:5555 " weiter. Das Problem ist: Wenn der Anwendungsserver den Benutzer mithilfe des absoluten Pfads zu einer anderen Seite auf demselben Server umleiten muss, wurde die letztere URL verwendet, und die Benutzer haben keinen Zugriff darauf. Die Verwendung von X-Forwarded-Host (+ X-Forwarded-Proto und X-Forwarded-Port) erlaubte unserem Proxy, dem Anwendungsserver mitzuteilen, welcher URL-Benutzer ursprünglich verwendet wurde, und der Server begann damit, in seinen Antworten den korrekten absoluten Pfad zu generieren.

In diesem Fall gab es keine Möglichkeit, den Anwendungsserver anzuhalten, um absolute URLs zu generieren, oder ihn manuell für "öffentliche URL" zu konfigurieren.

8
Xantrul

Ein Beispiel könnte ein Proxy sein, der bestimmte Hosts blockiert und auf eine externe Blockseite umleitet. Ich bin fast sicher, dass mein Schulfilter das tut…

(Und der Grund, warum sie die ursprüngliche Host möglicherweise nicht einfach als Host weitergeben, ist der, dass einige Server [Nginx?] Jeglichen Verkehr zur falschen Host ablehnen.

3
Ry-

Für den Bedarf an 'x-forwarded-Host' kann ich mir ein virtuelles Hosting-Szenario vorstellen, bei dem mehrere interne Hosts (internes Netzwerk) und ein Reverse-Proxy zwischen diesen Hosts und dem Internet vorhanden sind. Wenn der angeforderte Host Teil des internen Netzwerks ist, wird der angeforderte Host in die Reverse Proxy-IP-Adresse aufgelöst, und der Webbrowser sendet die Anforderung an den Reverse Proxy. Dieser Reverse Proxy sucht den entsprechenden internen Host und leitet die vom Client gesendete Anforderung an diesen Host weiter. Dabei ändert der Reverse Proxy das Feld Host in Übereinstimmung mit dem internen Host und setzt den x-forward-Host auf den vom Client angeforderten tatsächlichen Host. Weitere Informationen zum Reverse Proxy finden Sie auf dieser Wikipedia-Seite http://en.wikipedia.org/wiki/Reverse_proxy

In diesem Beitrag finden Sie Details zum Header "x-forwarded-for" und ein einfaches Demo-Python-Skript, das zeigt, wie ein Webserver die Verwendung eines Proxyservers erkennen kann: x-forwarded-for erklärt

3
guest

X-Forwarded-Host hat gerade mein Leben gerettet. CDNs (oder Reverse Proxy, wenn Sie zu "Bäumen" gehen möchten) bestimmen, welchen Origin der Host-Header verwendet, mit dem ein Benutzer zu ihm kommt. Daher kann ein CDN nicht denselben Hostheader verwenden, um den Origin zu kontaktieren. Andernfalls würde das CDN in einer Schleife zu sich selbst gehen und nicht zum Origin. Daher verwendet das CDN entweder eine IP-Adresse oder einen Dummy-FQDN als Hostheader, der Inhalt aus dem Origin abruft. Nun möchte Origin möglicherweise wissen, nach welcher Host-Kopfzeile (alias Website-Name) der Inhalt gefragt wurde. In meinem Fall bediente eine Origin zwei Websites.

2
wick

In einem anderen Szenario lizenzieren Sie Ihre App für eine Host-URL, um die Last auf n> 1 Server zu laden.

0
ColWhi