Removendo segmentos de caminho com valores codificados para nginx

1

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?

    
por Daniel A. White 27.04.2016 / 12:41

1 resposta

0

Eu acho que algo estava errado com set_unescape_uri e a variável regex ou qualquer outra coisa. Usando o formulário de argumento único de set_unescape_uri funciona.

location ~* ^api/([^/]+)(/.+)$ {
     set $my_host $1;
     if ( $request_uri ~* ^api/([^/]+)(/.+)$ ) {
          set $my_path $2;
          set_unescape_uri $my_path;
     }
     proxy_pass http://$myhost$my_path$is_args$args;
}
    
por 27.04.2016 / 14:14