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?