Observe que a decodificação de URL, comumente conhecida como $uri
"normalização" na documentação de nginx, acontece antes do IFF backend:
-
qualquer URI é especificado dentro de proxy_pass
em si, mesmo que apenas a barra final por si só,
-
ou, o URI é alterado durante o processamento, por exemplo, através de rewrite
.
Ambas as condições são explicitamente documentadas no link (grifo meu):
If the proxy_pass
directive is specified with a URI, then when a request is passed to the server, the part of a normalized request URI matching the location is replaced by a URI specified in the directive
If proxy_pass
is specified without a URI, the request URI is passed to the server in the same form as sent by a client when the original request is processed, or the full normalized request URI is passed when processing the changed URI
A solução é omitir o URI como no caso dos OPs ou, de fato, usar uma regra rewrite
inteligente:
# map '/foo' to '/foo':
location /foo {
proxy_pass http://localhost:8080; # no URI -- not even just a slash
}
# map '/foo' to '/bar':
location /foo {
rewrite ^ $request_uri; # get original URI
rewrite ^/foo(/.*) /bar$1 break; # drop /foo, put /bar
return 400; # if the second rewrite won't match
proxy_pass http://localhost:8080$uri;
}
Você pode vê-la ao vivo em uma resposta relacionada ao Stack Overflow , incluindo o grupo de controle.