Quando eu navego para este URL: http://localhost:8080/foo/%5B-%5D
server ( nc -l 8080
) recebe como está:
GET /foo/%5B-%5D HTTP/1.1
No entanto, quando eu proxy esse aplicativo via nginx (1.1.19):
location /foo {
proxy_pass http://localhost:8080/foo;
}
A mesma solicitação roteada pela porta nginx é encaminhada com o caminho decodificado:
GET /foo/[-] HTTP/1.1
Os colchetes decodificados no caminho GET estão causando os erros no servidor de destino ( HTTP Status 400 - Caractere ilegal no caminho ... ) à medida que chegam sem escape.
Existe uma maneira de desativar a decodificação de URL ou codificá-la de volta para que o servidor de destino obtenha exatamente o mesmo caminho quando roteado pelo nginx? Alguma regra de reescrita inteligente de URL?
Respostas:
Citando Valentin V. Bartenev (que deve receber todo o crédito por esta resposta):
fonte
http://localhost:8080/
para ohttp://localhost:8080
caso de alguém ter a mesma situação que eu.Observe que a decodificação de URL, comumente conhecida como
$uri
"normalização" na documentação do nginx, ocorre antes do IFF de back-end:qualquer URI é especificado em
proxy_pass
si mesmo, mesmo que apenas a barra final por si só,ou, o URI é alterado durante o processamento, por exemplo, através
rewrite
.Ambas as condições estão explicitamente documentadas em http://nginx.org/r/proxy_pass (ênfase minha):
A solução é omitir o URI como no caso dos OPs ou, de fato, usar uma
rewrite
regra inteligente :Você pode vê-lo ao vivo em uma resposta de Estouro de pilha relacionada , incluindo um grupo de controle.
fonte
http://localhost:8080
). Se você não concorda, pode aceitar os autores da RFC 3986.