Caminho de transformação de regra de redirecionamento NGINX para a cadeia de consulta

1

Temos um aplicativo existente do IIS que estava sendo executado com o Helicon APE para reescrever URLs usando as 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 . Isso suporta um número variável de caminhos intermediários no APE (aparentemente também no Apache).

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

Um problema que encontrei: a mesma regra para reescrever o nginx não funciona da mesma maneira; Eu tive que transformá-lo para obter correspondência:

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

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

Eu tenho tentado encontrar uma maneira de fazer o nginx para converter elementos de caminho /x/y/g/z em pares de string de consulta ?x=y&g=z . O Apache parece torná-lo automaticamente, enquanto nginx não, e não consegue encontrar nada na documentação ou em outras questões neste site, ou StackOverflow.

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

    
por mydaemon 12.12.2017 / 02:01

1 resposta

0

Se você construir a regra de reescrita corretamente, ela se tornará recursiva e consultará os 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 rewrite anexa automaticamente uma string de consulta existente, a declaração acima a estende a cada redirecionamento.

O mesmo truque pode ser alcançado com um redirecionamento interno colocando uma instrução rewrite...last dentro de um bloco location .

Veja este documento para saber mais.

    
por 12.12.2017 / 11:55

Tags