convert regex mod-rewrite nginx rewrite

regex - convert - mod_rewrite a reglas de reescritura de nginx



rewrite regex nginx (1)

He convertido la mayoría de mis reglas Apache HTTPd mod_rewrite al módulo HttpRewrite de nginx (que llama a PHP-FPM a través de FastCGI en cada solicitud dinámica). Las reglas simples que están definidas por ubicaciones difíciles funcionan bien:

location = /favicon.ico { rewrite ^(.*)$ /_core/frontend.php?type=ico&file=include__favicon last; }

Todavía tengo problemas con las expresiones regulares, que se analizan en mod_rewrite de esta manera (tenga en cuenta que estoy aceptando barras diagonales en las reglas, y anexando la cadena de consulta a cada solicitud):

mod_rewrite

# File handler RewriteRule ^([a-z0-9-_,+=]+)/.([a-z]+)$ _core/frontend.php?type=$2&file=$1 [QSA,L] # Page handler RewriteRule ^([a-z0-9-_,+=]+)$ _core/frontend.php?route=$1 [QSA,L] RewriteRule ^([a-z0-9-_,+=]+)//$ _core/frontend.php?route=$1 [QSA,L] RewriteRule ^([a-z0-9-_,+=]+)//([a-z0-9-_,+=]+)$ _core/frontend.php?route=$1/$2 [QSA,L] RewriteRule ^([a-z0-9-_,+=]+)//([a-z0-9-_,+=]+)//$ _core/frontend.php?route=$1/$2 [QSA,L] RewriteRule ^([a-z0-9-_,+=]+)//([a-z0-9-_,+=]+)//([a-z0-9-_,+=]+)$ _core/frontend.php?route=$1/$2/$3 [QSA,L] RewriteRule ^([a-z0-9-_,+=]+)//([a-z0-9-_,+=]+)//([a-z0-9-_,+=]+)//$ _core/frontend.php?route=$1/$2/$3 [QSA,L]

He creado la siguiente configuración de servidor para el sitio, pero me encuentro con reglas incomparables después de analizar una solicitud (por ejemplo, GET /user/auth ):

intentó reescribir nginx

location / { # File handler rewrite ^([a-z0-9-_,+=]+)/.([a-z]+)?(.*)$ /_core/frontend.php?type=$2&file=$1&$3 break; # Page handler rewrite ^([a-z0-9-_,+=]+)(//*)?(.*)$ /_core/frontend.php?route=$1&$2 break; rewrite ^([a-z0-9-_,+=]+)//([a-z0-9-_,+=]+)(//*)?(.*)$ /_core/frontend.php?route=$1/$2&$3 break; rewrite ^([a-z0-9-_,+=]+)//([a-z0-9-_,+=]+)//([a-z0-9-_,+=]+)(//*)?(.*)$ /_core/frontend.php?route=$1/$2/$3&$4 break; }

¿Qué sugeriría para tratar con mi Manejador de archivos (que es simplemente filename.ext ) y mi Manejador de página (que es una solicitud de ruta única con hasta 3 propiedades definidas por una barra inclinada)?

Como aún no he obtenido una respuesta de esto, tampoco estoy seguro de si esto anulará mi analizador PHP, que se define con la location ~ /.php {} , que se incluye antes de estas reglas de reescritura.

Puntos de bonificación si puedo resolver los problemas de análisis sin la necesidad de usar una nueva regla para cada número de propiedades de ruta.


Terminé escribiendo las siguientes reglas:

Manejador de archivos

location ~ ^/([a-zA-Z0-9-_]*)/.([a-zA-Z0-9]*)$ { include /web/_config/php.conf; rewrite ^/([a-zA-Z0-9-_]*)/.([a-zA-Z0-9]*)$ /_core/frontend.php?type=$2&file=$1 last; }

El manejador de archivos toma el nombre y la extensión y los escribe en type = {ext} & file = {name}.

Manejador de página

location ~ ^/([a-z0-9-_]*)$ { include /web/_config/php.conf; rewrite ^/([a-z0-9-_]*)$ /_core/frontend.php?route=$1 last; } location ~ ^/([a-z0-9-_]*)/?([a-z0-9-_]*)$ { include /web/_config/php.conf; rewrite ^/([a-z0-9-_]*)/?([a-z0-9-_]*)$ /_core/frontend.php?route=$1/$2 last; } location ~ ^/([a-z0-9-_]*)/?([a-z0-9-_]*)/?([a-z0-9-_]*)$ { include /web/_config/php.conf; rewrite ^/([a-z0-9-_]*)/?([a-z0-9-_]*)/?([a-z0-9-_]*)$ /_core/frontend.php?route=$1/$2/$3 last; }

El controlador de página (que en este caso maneja hasta 3 "directorios") toma la cadena entre cada separador (/), realiza una validación de expresiones regulares y la escribe como una cadena de consulta.

La diferencia principal entre esto y mi configuración original era que cada entrada tiene su propio controlador de ubicación, con la last regla que procesa en la primera coincidencia, por lo que el rendimiento debería ser un poco mejor.

También descubrí que nginx agrega cadenas de consulta de forma predeterminada, por lo que no se requiere regex, otra mejora de rendimiento.

Tenga en cuenta que /web/_config/php.conf es simplemente una configuración de paso /web/_config/php.conf FastCGI, y la enviada con nginx (generalmente /etc/nginx/fastcgi.conf ) debería funcionar bien. Tenga en cuenta que si se trata exclusivamente de PHP, no necesita definir esto en cada regla, simplemente anteponga el include.

Espero que esto ayude.