Regla de redireccionamiento NGINX transforma la ruta a la cadena de consulta

Regla de redireccionamiento NGINX transforma la ruta a la cadena de consulta

Tenemos una aplicación IIS existente que se ejecuta con Helicon APE para reescribir las URL utilizando las reglas de Apache existentes. Este es un ejemplo:

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

Para estas reglas, una URL original como /webapp/f6/3/gx/1/default.htmse transforma en /default.htm?f6=3&gx=1. Esto admite un número variable de rutas intermedias en APE (aparentemente también en Apache).

Dado que APE no escala bien y falla bajo carga, comencé a configurar un NGINX que realizará las reescrituras y realizará el equilibrio de carga para los servidores IIS en la parte posterior.

Sin embargo, encontré un problema: la misma regla para las reescrituras de nginx no funciona de la misma manera; Tuve que transformarlo para que coincidiera:

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

que, de hecho, para /webapp/f6/3/gx/1/default.htmdevoluciones /webapp/default.htm?f6/3/gx/1.

He estado tratando de encontrar una manera de hacer que nginx convierta elementos de ruta /x/y/g/zen pares de cadenas de consulta ?x=y&g=z. Apache parece hacerlo automáticamente, mientras que nginx no lo hace y no puede encontrar nada en la documentación ni en otras preguntas de este sitio ni de StackOverflow.

Aparentemente, esto se podría hacer usando map, pero no puedo encontrar un uso específico y no soy un experto en nginx para hacerlo. Cualquier ayuda o indicación. será bienvenido.

Respuesta1

Si construye la regla de reescritura correctamente, se volverá recursiva y consultará parámetros en cada iteración hasta que se consuman todos los elementos de la ruta.

Por ejemplo:

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

Como rewriteagrega automáticamente una cadena de consulta existente, la declaración anterior la extiende con cada redireccionamiento.

Se puede lograr el mismo truco con una redirección interna colocando una rewrite...lastdeclaración dentro de un locationbloque.

Vereste documentopara más.

información relacionada