
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.htm
retornos /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/z
em 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 rewrite
anexa 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...last
instrução dentro de um location
bloco.
Veresse documentopara mais.