
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.htm
se 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.htm
devoluciones /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/z
en 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 rewrite
agrega 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...last
declaración dentro de un location
bloque.
Vereste documentopara más.