In Nginx haben wir versucht, eine URL wie folgt umzuleiten:
http://example.com/some/path -> http://192.168.1.24
wo der Benutzer noch die ursprüngliche URL in ihrem Browser sieht. Sobald der Benutzer umgeleitet wurde, sagen /section/index.html
wir , dass er auf den Link zu klickt , möchten wir, dass dies eine Anfrage macht, die zur Umleitung führt
http://example.com/some/path/section/index.html -> http://192.168.1.24/section/index.html
und noch einmal die ursprüngliche URL beibehalten.
Unsere Versuche umfassten verschiedene Lösungen unter Verwendung von Proxys und Umschreibregeln. Im Folgenden wird die Konfiguration gezeigt, die uns einer Lösung am nächsten gebracht hat (beachten Sie, dass dies die Webserverkonfiguration für den example.com
Webserver ist). Es gibt jedoch immer noch zwei Probleme:
- Das erneute Schreiben wird nicht ordnungsgemäß ausgeführt, da die vom Webserver empfangene Anforderungs-URL die erforderliche Seite
http://192.168.1.24
enthält/some/path
und daher nicht bereitstellt. Wenn Sie auf einem Link schweben, nachdem eine Seite geliefert wurde,
/some/path
fehlt in der URLserver { listen 80; server_name www.example.com; location /some/path/ { proxy_pass http://192.168.1.24; proxy_redirect http://www.example.com/some/path http://192.168.1.24; proxy_set_header Host $host; } location / { index index.html; root /var/www/example.com/htdocs; } }
Wir suchen nach einer Lösung, bei der nur die Webserverkonfiguration geändert werden muss example.com
. Wir können die Konfiguration auf 192.168.1.24
(auch auf Nginx) ändern , möchten dies jedoch vermeiden, da wir dieses Setup für Hunderte verschiedener Server wiederholen müssen, über die der Zugriff erfolgt example.com
.
root
einemlocation
Block verwendet wird, dann werden Sie kein unerwartetes Verhalten für Standardspeicherorte erhalten. Nur wenn Sie den Standardroot
für jeden Standort ändern müssen, können Sie ihn verwenden.Sie sollten den URI-Teil in der
proxy_pass
Direktive verwenden. Außerdem haben Sie die Ordnungsargumente derproxy_redirect
Direktive vertauscht, und wahrscheinlich brauchen Sie sie überhaupt nicht. Nginx hat einen angemessenen Standard für diese Richtlinie.In diesem Fall könnte Ihr
location
Block sehr einfach sein:quelle
/some/path/
Teil der URL in der Anforderung erhalten bleibt, der keine gültige URL ist (wir müssen auch die URL neu schreiben, um diese zu entfernen).Sie können die folgende Konfiguration verwenden, um eine 100% nahtlose Zuordnung zwischen
/some/path/
dem Front-End und/
dem Back -End zu erzielen.Beachten Sie, dass dies die einzige Antwort ist, die sich auch nahtlos um die Erzeugung von
404 Not Found
Fehlern bei absoluten Pfaden kümmert , vorausgesetzt,Referer
der Browser sendet den richtigen HTTP- Header. Daher sollten alle diese Gifs weiterhin geladen werden, ohne dass der zugrunde liegende HTML-Code geändert werden muss (Das ist nicht nur teuer, sondern wird auch ohne zusätzliche Module, die nicht standardmäßig kompiliert wurden, nicht unterstützt.)Sie finden den vollständigen Proof-of-Concept und das Produkt mit minimaler Lebensfähigkeit im Repository https://github.com/cnst/StackOverflow.cnst.nginx.conf .
Hier ist ein Testlauf, um zu bestätigen, dass alle Edge-Fälle zu funktionieren scheinen:
PS : Wenn Sie viele verschiedene Wege haben, kartieren dann anstelle eines regex Vergleich zu tun ,
$http_referer
innerhalb einesif
innerhalblocation @404
, könnte man die globale Basis verwenden möchtenmap
Richtlinie statt.Beachten Sie auch, dass die abschließenden Schrägstriche sowohl in dem
proxy_pass
als auch in dem , in demlocation
es enthalten ist, gemäß einer verwandten Antwort ziemlich wichtig sind .Verweise:
quelle
Wenn dieser Schrägstrich zu einem Nginx-Proxy-Jenkin hinzugefügt wird, wird der Fehler "Offenbar ist Ihr Reverse-Proxy-Setup fehlerhaft" angezeigt.
Es sollte lesen
quelle