Gdy przeglądam ten adres URL: http://localhost:8080/foo/%5B-%5D
server ( nc -l 8080
) otrzymuje go takim, jakim jest:
GET /foo/%5B-%5D HTTP/1.1
Jednak gdy proxy tej aplikacji przez proxy nginx (1.1.19):
location /foo {
proxy_pass http://localhost:8080/foo;
}
To samo żądanie przekierowane przez port Nginx jest przekazywane z dekodowaną ścieżką:
GET /foo/[-] HTTP/1.1
Zdekodowane nawiasy kwadratowe w ścieżce GET powodują błędy na serwerze docelowym ( HTTP Status 400 - Niedozwolony znak na ścieżce ... ), gdy przybywają bez zmiany znaczenia.
Czy istnieje sposób na wyłączenie dekodowania adresu URL lub jego ponowne zakodowanie, aby serwer docelowy uzyskał dokładnie tę samą ścieżkę, gdy jest kierowany przez nginx? Jakaś sprytna reguła przepisywania adresów URL?
Odpowiedzi:
Cytując Valentina V. Barteneva (który powinien uzyskać pełne uznanie za tę odpowiedź):
źródło
http://localhost:8080/
nahttp://localhost:8080
wypadek, gdyby ktoś miał taką samą sytuację jak ja.Zauważ, że dekodowanie adresów URL, powszechnie znane jako
$uri
„normalizacja” w dokumentacji nginx, odbywa się przed IFF zaplecza:albo dowolny identyfikator URI jest określony
proxy_pass
sam w sobie, nawet jeśli sam ukośnik jest sam,lub URI jest zmieniany podczas przetwarzania, np
rewrite
. przez .Oba warunki są wyraźnie udokumentowane na stronie http://nginx.org/r/proxy_pass (moje podkreślenie):
Rozwiązaniem jest albo pominięcie URI, jak w przypadku OP, lub, w istocie, zastosowanie sprytnej
rewrite
reguły:Możesz zobaczyć to na żywo w powiązanej odpowiedzi Przepełnienie stosu , w tym grupie kontrolnej.
źródło
http://localhost:8080
.). Jeśli się nie zgadzasz, możesz porozmawiać z autorami RFC 3986.