Caminho de transformação da regra de redirecionamento NGINX para string de consulta

Caminho de transformação da regra de redirecionamento NGINX para string de consulta

Temos um aplicativo IIS existente que estava sendo executado com Helicon APE para reescrever URLs usando regras existentes do Apache. Este é um exemplo:

RewriteRule ^/webapp/([^/]*)/([^/]*)(/.+)? /webapp/$4?$2=$3 [NC,L,P,QSA]

Para essas regras, um URL original como /webapp/f6/3/gx/1/default.htmé transformado em /default.htm?f6=3&gx=1. Isto suporta um número variável de caminhos intermediários no APE (aparentemente no Apache também).

Como o APE não escala bem e trava sob carga, comecei a configurar um NGINX que fará as reescritas e realizará o balanceamento de carga para os servidores IIS na parte traseira.

Porém, descobri um problema: a mesma regra para reescritas do nginx não funciona da mesma maneira; Eu tive que transformá-lo para combinar:

rewrite ^/webapp/(.*)/([^/]+).htm /webapp/$2?$1;

que, na verdade, para /webapp/f6/3/gx/1/default.htmretornos /webapp/default.htm?f6/3/gx/1.

Tenho tentado encontrar uma maneira de fazer com que o nginx converta elementos do caminho /x/y/g/zem pares de strings de consulta ?x=y&g=z. O Apache parece fazer isso automaticamente, enquanto o nginx não, e não consegue encontrar nada na documentação ou em outras questões neste site, ou no StackOverflow.

Aparentemente, usando map, isso poderia ser feito, mas não consigo encontrar um uso específico, e não sou especialista em nginx para fazer isso. Qualquer ajuda ou indicação. será bem-vindo.

Responder1

Se você construir a regra de reescrita corretamente, ela se tornará recursiva e consultará parâmetros em cada iteração até que todos os elementos do caminho sejam consumidos.

Por exemplo:

rewrite ^(/webapp)/([^/]+)/([^/]+)(/.+)$ $1$4?$2=$3 redirect;

Como rewriteanexa automaticamente uma string de consulta existente, a instrução acima a estende a cada redirecionamento.

O mesmo truque pode ser conseguido com um redirecionamento interno, colocando uma rewrite...lastinstrução dentro de um locationbloco.

Veresse documentopara mais.

informação relacionada