Frage Nginx-Proxy-Weiterleitungen ignorieren Port


Also richte ich einen virtuellen Pfad ein, wenn ich auf eine node.js App in meinem nginx conf zeige. Der relevante Abschnitt sieht so 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 großartig, außer dass meine node.js App (eine Express-App) eine Weiterleitung aufruft.

Als Beispiel, die Dev-Box läuft mit nginx auf Port 8080 und so sieht die URL zum root der Knoten-App aus:

http: // localhost: 8080 / app

Wenn ich vom Knoten eine Weiterleitung zu '/ app' anrufe, geht die tatsächliche Weiterleitung zu:

http: // localhost / app


26
2018-02-23 20:20


Ursprung




Antworten:


Das Problem besteht darin, dass die Anwendung Node.js die Weiterleitung nicht korrekt ausgibt. Sie können möglicherweise verwenden proxy_redirect um dies in nginx zu korrigieren:

proxy_redirect http://localhost/ http://localhost:8080/;

11
2018-03-27 22:39





Ich musste das gleiche Problem lösen, als Jenkins hinter Nginx lief. Was war es für mich, den Server - Port in die Host Header, der an Jenkins gesendet wird:

proxy_set_header Host $host:$server_port;

Hoffentlich hilft das.


37
2017-07-16 00:43



Bingo. wie @Mgorven sagt, Knoten setzt die Weiterleitung schlecht, weil nginx den Host schlecht weiterleitet - Eric
Dieser hat mich gerettet, danke! - Gus


Ich hatte dieses Problem und benutze es $http_host anstatt $host hat für mich funktioniert, da es auch die Portnummer beinhaltet.


28
2017-10-27 15:20



Diese Lösung hat für mich funktioniert. - Kita
Das ist besser als $host:$server_port weil es anders als der in der URL vorhandene Port verwendet $server_port welches den Port benutzt, auf dem nginx zuhört. Der Unterschied wird real, wenn Sie eine Verbindung zu einem nginx-Reverse-Proxy über eine andere Port-Map herstellen, z. ssh -L oder Docker ports. - Jozef Knaperek
@JozefKnaperek, könntest du bitte deinen Kommentar ein bisschen mehr erklären (vielleicht mit einem Beispiel und mit einige Referenzen?). Ich finde es sehr interessant und es sollte eine separate Antwort sein, oder zumindest diese Antwort zu bearbeiten. Nicht nur ein Kommentar. - Mohammed Noureldin
Nicht viel weiter zu sagen. $ http_host enthält den Wert wie im HTTP-HOST-Header angegeben, deshalb funktioniert es auch, wenn Sie Port-Umleitungen zwischen Ihrem nginx und dem User-Agent haben. - Jozef Knaperek
@ JozefKnaperek macht hier einen tollen Punkt. Dies war für mich erforderlich, wenn ich hinter Docker lief (im Grunde eine andere Schicht von Reverse-Proxying), da Docker den Port neu schreibt, wenn er den Verkehr zum Container leitet. - Mike Hill


Ich habe die oben genannten Lösungen ausprobiert, aber sie sind alle fehlgeschlagen, wenn die Knotenanwendung eine vollständig qualifizierte URL im Standortheader ausgegeben hat, z. B. "http://nodeapp.com:8080/new/location"

Also habe ich den $ http_host benutzt, um Host und Port zu übergeben. Und mit a match ~ ^ um die URLs komplett neu zu schreiben.

  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 Node-Server auf 8080 und unser Nginx-Proxy läuft auf 8000. Das bedeutet, dass jede vollständig qualifizierte URL in einem Standort-Header neu geschrieben werden muss. Hoffe das hilft jemandem !!


3
2017-08-27 16:59





Nach dem Gespräch auf diese FrageDie richtige Auflösung besteht darin, die Proxy-Server anzupassen Host Header-Anweisung.

Ändere das:

proxy_set_header Host $host;

Zu diesem:

proxy_set_header Host $http_host;

$http_host enthält den Wert wie im Header HTTP HOST angegeben, der den Port enthält. Redirects sollten den benutzerdefinierten Port ohne weitere Anpassung an die OP-Einrichtung übernehmen.

Diese Antworten (dasselbe Ticket) führen weiter aus:


0
2018-06-14 20:55