Wenn ich zu dieser URL navigiere, empfängt http://localhost:8080/foo/%5B-%5D
server ( nc -l 8080
) sie wie sie ist:
GET /foo/%5B-%5D HTTP/1.1
Wenn ich diese Anwendung jedoch über Nginx (1.1.19) als Proxy verwende:
location /foo {
proxy_pass http://localhost:8080/foo;
}
Dieselbe Anfrage, die über den Nginx-Port weitergeleitet wird, wird mit dekodiertem Pfad weitergeleitet:
GET /foo/[-] HTTP/1.1
Dekodierte eckige Klammern im GET-Pfad verursachen die Fehler auf dem Zielserver ( HTTP-Status 400 - Unzulässiges Zeichen im Pfad ... ), wenn sie ohne Escapezeichen eintreffen.
Gibt es eine Möglichkeit, die URL-Dekodierung zu deaktivieren oder zurück zu kodieren, damit der Zielserver bei der Weiterleitung durch nginx genau denselben Pfad erhält? Eine clevere Regel zum Umschreiben von URLs?
Antworten:
Zitat Valentin V. Bartenev (wer sollte die volle Anerkennung für diese Antwort bekommen):
quelle
http://localhost:8080/
,http://localhost:8080
falls jemand die gleiche Situation hat wie ich.Beachten Sie, dass die URL-Dekodierung, die in der Dokumentation von nginx allgemein als
$uri
"Normalisierung" bezeichnet wird , vor dem Back-End-IFF erfolgt:Entweder wird ein beliebiger URI in sich
proxy_pass
selbst angegeben, auch wenn nur der abschließende Schrägstrich für sich allein steht.oder URI wird während der Verarbeitung geändert, z
rewrite
. B. durch .Beide Bedingungen sind explizit unter http://nginx.org/r/proxy_pass (Hervorhebung meiner) dokumentiert :
Die Lösung besteht darin, entweder die URI wegzulassen, wie im Fall von OPs, oder in der Tat eine clevere
rewrite
Regel zu verwenden:Sie können es live in einer verwandten Stapelüberlauf-Antwort sehen , einschließlich der Kontrollgruppe.
quelle
http://localhost:8080
). Wenn Sie anderer Meinung sind, können Sie sich an die Autoren von RFC 3986 wenden.