Nginx-Proxy-Weiterleitung ignoriert Port

34

Ich richte also einen virtuellen Pfad ein, wenn ich auf eine node.js-App in meiner nginx conf zeige. Der entsprechende Abschnitt sieht folgendermaßen aus:

location /app {
  rewrite /app/(.*) /$1 break;
  proxy_pass http://localhost:3000;
  proxy_redirect off;
  proxy_set_header Host $host;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

Funktioniert hervorragend, außer dass meine node.js-App (eine Express-App) eine Umleitung aufruft.

Beispiel: Auf der Dev-Box wird Nginx auf Port 8080 ausgeführt. Die URL zum Stammverzeichnis der Node-App sieht also folgendermaßen aus:

http: // localhost: 8080 / app

Wenn ich eine Weiterleitung vom Knoten zu '/ app' aufrufe, wird die eigentliche Weiterleitung an folgende Adresse gesendet:

http: // localhost / app

Paul
quelle
Hier einige Antworten, die die Verwendung vorschlagen: proxy_set_header Host $ http_host; Aber niemand sagte, dass dies eine Sicherheitslücke verursachen kann (Host-Header-Angriff). Angriffsbeispiel hier Und weitere Informationen hier

Antworten:

14

Das Problem ist, dass die Node.js-Anwendung die Umleitung nicht korrekt ausgibt. Möglicherweise können Sie proxy_redirectdies in nginx folgendermaßen korrigieren:

proxy_redirect http://localhost/ http://localhost:8080/;
mgorven
quelle
47

Ich musste nur das gleiche Problem lösen, als Jenkins hinter Nginx lief. Für mich war es wichtig, den Server-Port in den HostHeader aufzunehmen, der an Jenkins gesendet wird:

proxy_set_header Host $host:$server_port;

Hoffentlich hilft das.

Vojislav Stojkovic
quelle
3
Bingo. Wie @mgorven sagt, setzt Node die Umleitung schlecht, weil Nginx den Host schlecht weiterleitet
Eric
5

Ich habe die obigen Lösungen ausprobiert, aber alle sind fehlgeschlagen, wenn die Knotenanwendung eine vollqualifizierte URL im Standortheader ausgegeben hat, z. B. " http://nodeapp.com:8080/new/location ".

Also habe ich den $ http_host verwendet, um Host und Port zu übergeben. Und mit einem Match ~ ^ können Sie die URLs komplett umschreiben.

  proxy_pass http://10.0.0.3:8080;

  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header Host $http_host;

  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

  proxy_redirect default;
  proxy_redirect ~^(https?://[^:]+):\d+(?<relpath>/.+)$ http://10.0.0.3:8000$relpath;

In unserem Fall läuft der Knotenserver auf 8080 und unser Nginx-Proxy auf 8000. Dies bedeutet, dass jede vollqualifizierte URL in einem Standortheader neu geschrieben werden muss. Hoffe das hilft jemandem !!

Mark Riggins
quelle
4

Gemäß der Konversation zu dieser Frage besteht die richtige Lösung darin, die HostHeader-Direktive des Proxys anzupassen .

Ändere das:

proxy_set_header Host $host;

Dazu:

proxy_set_header Host $http_host;

$http_hostEnthält den im HTTP-HOST-Header angegebenen Wert, der den Port enthält. Redirects sollten den benutzerdefinierten Port ohne weitere Anpassung des OP-Setups abrufen.

Diese Antworten (dasselbe Ticket) werden weiter ausgeführt:

Frank Koehl
quelle