Ich habe eine laufende Web-Anwendung auf http://example.com/
und möchte eine andere Anwendung auf einem separaten Server "mounten" http://example.com/en
. Upstream-Server und proxy_pass
scheinen zu funktionieren, aber für ein Problem:
upstream luscious {
server lixxxx.members.linode.com:9001;
}
server {
root /var/www/example.com/current/public/;
server_name example.com;
location /en {
proxy_pass http://luscious;
}
}
Beim Öffnen example.com/en
kehrt meine vorgelagerte Anwendung zurück 404 not found /en
. Dies ist sinnvoll, da der Upstream den Pfad nicht hat /en
.
Ist proxy_path
die richtige lösung Soll ich "upstream" umschreiben, damit es /en
stattdessen als Root-Pfad abhört ? Oder gibt es eine Direktive, mit der ich den Pfad, der zum Upstream weitergeleitet wurde, umschreiben kann?
proxy_pass
macht den Unterschied. Außerdem ist diese Antwort korrekter als die, die Sie sich ausgedacht haben, da sie auch sicherstellt, dass sie erhaltenproxy_redirect
bleibtdefault
, sodass Sie302
et al in Ihrem Backend weiterhin verwenden können und es überall korrekt funktioniert.Ich möchte auf eine neuere, auf Regex basierende Antwort eingehen, die immer beliebter wird.
Die Lösung mag auf den ersten Blick niedlicher erscheinen, ist aber aus mehreren Gründen falsch.
Der obige reguläre Ausdruck würde einem Request-URL von entsprechen
/enjoy
und ihn auf den/joy
Upstream umleiten . Ist das wirklich beabsichtigt?Eine Anfrage nach
/en
führt nicht zu Weiterleitungen, die direkt/
vom Upstream bereitgestellt werden (fast so, als wäre/en/
stattdessen eine Anfrage nach gestellt worden, aber nicht ganz). Wenn Sie stromaufwärts relativ URIs innerhalb Ihrer Root - Seite verwenden (sonst, warum nicht haben Sie das/en/
Präfix genau dort in dem Upstream - URIs?), ZBsrc="style.css"
(die ein sprachspezifische Referenz könntenurl("menu.png")
, zum Beispiel), dann wird der Browser verlangt , dass als/style.css
statt/en/style.css
. (Oder auch wenn Sie überall absolute URIs verwenden, was ist, wenn jemand relativ auf eine undurchsichtige, semi-optionale Ressource verweist?)Gemäß meinem früheren Rat bei einer anderen Frage, die bereits in der eigenen Antwort des OP erwähnt wurde , verhindert die Verwendung regulärer Ausdrücke, dass die
proxy_redirect
Direktive den Standardwert vondefault
hat undoff
stattdessen auf " down to" zurückgesetzt wird. Dies bedeutet, dass, wenn der Upstream aufLocation: http://127.0.0.1:8080/en/dir/
eine Anfrage antwortet/en/dir
, der Client dies sieht, was offensichtlich nicht richtig funktioniert. (Was besonders ironisch für eine/en
Anfrage gewesen wäre, die die Verwendung von Regex in erster Linie auffordert, aber diese spezielle Implementierung leidet stattdessen an einem anderen Problem, wie oben bereits erwähnt.) Außerdem, wenn Sie bereits die verwendenupstream
Wenn Sie nur versuchen, einen benutzerdefinierten Server zu verwenden, kann dies besonders hässlich werden. Dies gilt insbesondere dann, wenn Sie möglicherweise mehr als einen Upstream-Server haben. Wie haben Sieproxy_redirect
für jeden dieser Server einen eigenen ? Sie könnten reguläre Ausdrücke auch innerhalb von verwendenproxy_redirect
, möglicherweise sogar, um mit einem beliebigen Host übereinzustimmen. Was ist dann, wenn Sie sich entscheiden, in Zukunft eine domänenübergreifende Umleitung durchzuführen?Um zu versuchen, einige der oben genannten Punkte mit einem einzigen, auf Regex basierenden Speicherort zu lösen, können wir Folgendes tun (beachten Sie, dass
proxy_pass
wir auch den Verweis auf einen Server aus einer auf Regexupstream
basierenden Direktive entfernen mussten, um diesproxy_redirect
einfacher zu gestalten):Also, wenn Sie mich fragen, wäre die ursprüngliche Lösung mit den beiden Standorten auf der obersten Ebene der Geschwister immer noch eine bessere Idee, als sich selbst in ein Kaninchenbau zu graben, indem Sie stattdessen den Regex-Weg gehen.
quelle
nginx: [emerg] location "/en" is outside location "^/en/?((?<=/).*
Also habe ich die Antwort auf stackoverflow gefunden :
Grundsätzlich gilt: Übergeben eines regulären Ausdrucks an den Speicherort und Weitergeben der Rückreferenz an die proxy_pass-URL.
quelle
Buchhaltung nach Nginx-Dokumenten
Um eine Anforderung an einen HTTP-Proxy-Server zu übergeben, wird die Anweisung proxy_pass innerhalb eines Speicherorts angegeben. Zum Beispiel:
Diese Beispielkonfiguration führt dazu, dass alle an diesem Speicherort verarbeiteten Anforderungen an den Proxy-Server an der angegebenen Adresse weitergeleitet werden. Diese Adresse kann als Domainname oder als IP-Adresse angegeben werden. Die Adresse kann auch einen Port enthalten:
Beachten Sie, dass im obigen ersten Beispiel auf die Adresse des Proxy-Servers der URI / link / folgt. Wenn der URI zusammen mit der Adresse angegeben wird, ersetzt er den Teil des Anforderungs-URI, der mit dem Standortparameter übereinstimmt. Beispielsweise wird hier die Anfrage mit dem URI /some/path/page.html an http://www.example.com/link/page.html weitergeleitet . Wenn die Adresse ohne URI angegeben wird oder es nicht möglich ist, den zu ersetzenden Teil des URI zu bestimmen, wird der vollständige Anforderungs-URI übergeben (möglicherweise geändert).
quelle