Nginx läuft auf Port 80, und ich bin mit ihm Proxy - URLs mit Pfad umkehren /foo
zu Port auf 3200
diese Weise:
location /foo {
proxy_pass http://localhost:3200;
proxy_redirect off;
proxy_set_header Host $host;
}
Dies funktioniert einwandfrei, aber ich habe eine Anwendung auf dem Port 3200
, für die ich nicht möchte, dass die Initiale /foo
an gesendet wird. Das heißt - wenn ich darauf zugreife http://localhost/foo/bar
, möchte ich nur /bar
der Pfad sein, wie er von der App empfangen wird. Also habe ich versucht, diese Zeile zum obigen Standortblock hinzuzufügen:
rewrite ^(.*)foo(.*)$ http://localhost:3200/$2 permanent;
Dies bewirkt eine Weiterleitung 302 (Änderung der URL), aber ich möchte 301. Was soll ich tun?
nginx
reverse-proxy
301-redirect
Jeffreyveon
quelle
quelle
Antworten:
Jegliche Weiterleitung zu localhost ist auf einem entfernten System (z. B. dem Webbrowser des Clients) nicht sinnvoll. Daher sind die Umschreibungsflags permanent (301) oder umleiten (302) in Ihrem Fall nicht verwendbar.
Bitte versuchen Sie das folgende Setup mit einer transparenten Umschreiberegel:
Verwenden
curl -i
Sie diese Option, um Ihre Umschreibungen zu testen. Eine sehr subtile Änderung der Regel kann dazu führen, dass Nginx eine Umleitung durchführt.quelle
/foo(.*)
, sonst wirdexample.com/foo
nicht abgestimmt. (das ist wahrscheinlich, was Jeffreyveon erlebt hat)Der einfache Abgleich von Standortpräfixen funktioniert ohne Verwendung einer Umschreiberegel, solange Sie einen URI in der Anweisung proxy_pass angeben:
Beachten Sie den Zusatz
/
am Ende derproxy_pass
Richtlinie. NGINX entfernt das übereinstimmende Präfix/foo
und übergibt den Rest an den Back-End-Server am URI/
. Daherhttp://myserver:80/foo/bar
wird im Backend unter gepostethttp://localhost:3200/bar
.In den NGINX-Dokumenten zu proxy_pass :
quelle
//xyz
an den Host übergeben, wenn Sie das tun.Der absolut korrekteste Weg und die beste Vorgehensweise lauten normalerweise wie folgt:
Beachten Sie, wie wichtig der abschließende Schrägstrich ist
proxy_pass
, der die$uri
Variable automatisch so ändert , dass sie/foo/
im Frontend mit/
der im Backend übereinstimmt . Keine expliziterewrite
Anweisung erforderlich .Beachten Sie außerdem, dass das Nachziehen
/
derlocation
URL ebenfalls sehr wichtig ist. Ohne diese Angabe besteht die Gefahr, dass Ihre Website an einem bestimmten Punkt komisch aussehende URLs enthält (z. B. eine/fooen
zusätzliche URL/foo/en
).Darüber hinaus stellt das Nachziehen
/
deslocation
withproxy_pass
auch eine spezielle Behandlung gemäß der Dokumentation derlocation
Direktive sicher , um auch ein Implizit effektiv zu verursachenlocation = /foo {return 301 /foo/;}
.Wenn Sie also ein
location
mit dem abschließenden Schrägstrich wie oben definieren, stellen Sie nicht nur sicher, dass URLs ohne Suffix wie/fooen
ungültig sind, sondern auch, dass ein/foo
ohne abschließenden Schrägstrich weiterhin funktioniert.Referenzdokumentation:
quelle
$args
verloren:http://frontend/foo?bar=baz
wird zu proxiedhttp://backend/
. Beachten Sie, dass Argumente nicht Teil der URL sind$args
dass Sie trotzdem angemessen damit umgehen sollten, wenn Sie den obigen Code verwenden, da sie von diesem getrennt$uri
sind und wieder zusammengesetzt werden sollten, es sei denn, Sie verwenden explizite Variablen in Ihrem Codeproxy_pass
./foo
zu der umgeleitet werden muss. Wenn Sie also/foo/
im Backend nichts Seltsames tun,/foo
funktionieren auch Anfragen mit dem obigen Code. (Dies ist eigentlich schon Teil der Antwort, Übrigens.)Versuchen
oder
quelle
//xyz
an den Host übergeben, wenn Sie das tun.@Terabuck Es tut uns leid, dass wir noch nicht geantwortet haben.
Sie sollten localhost nicht verwenden, da Sie davon abhängig sind, dass die Anwendung auf einem Server mit einer Hosts-Datei ausgeführt wird. Lokaler Host ist nur eine Standardübersetzung auf 127.0.0.1. Es gibt nichts, was besagt, dass Sie diese Hosts-Dateien haben müssen. Es ist nur sehr verbreitet, einen zu haben.
Eine Loopback-Schnittstelle zu haben, ist wieder eine weitere häufige Sache, von der Sie abhängig sind, aber Sie sind immer noch von der Loopback-Schnittstelle auf dem Netzwerkstapel abhängig. Es ist ein seltener Fall, diese beiden nicht zu haben. Wenn Sie sich jemals darum sorgen. Zumindest unter Unix / Linux haben Sie die Möglichkeit für Sockets. Dadurch muss der Netzwerkstapel nicht mehr den lokalen Host erreichen. Gehen Sie bei diesem Ansatz mit Vorsicht vor, da einige Faktoren auf dem Host-Betriebssystem eine Rolle spielen. Wie die Anzahl der geöffneten Dateien usw.
quelle