Eu tenho um bloco location
como o seguinte
location ^api/([^/]+)(/.+)$ {
set $my_host $1;
set $my_path $2;
proxy_pass http://$myhost$my_path$is_args$args;
}
Isso funciona bem para a maioria dos casos normais de URIs, como /api/foo/bar?1234
.
No entanto, quando introduzo valores especiais codificados em URL, as coisas vão para o sul. Quando o URI é /api/foo/bar[%7B%7D]
, $my_path
é decodificado e é passado para $my_host
as /foo/bar[{}]
. Este não é um URL válido.
Eu tentei contornar as limitações do NGINX usando uma condicional para corresponder a $request_uri
e $uri
, mas os resultados são codificados ou não codificados.
location ~* ^api/([^/]+)(/.+)$ {
set $my_host $1;
if ( $request_uri ~* ^api/([^/]+)(/.+)$ ) {
set $my_path $2;
}
proxy_pass http://$myhost$my_path$is_args$args;
}
No caso acima, $my_path
é /foo/bar[%257B%257D]
.
Eu também tentei usar set_unescape_uri
do módulo set misc para o segundo regex.
Como posso obter o NGINX para remover os componentes do caminho no mesmo formato que o cliente os forneceu?