Cambiando de mod_rewrite de Apache a rewrite de nginx
Para cambiar el servidor web de Apache a nginx deberemos reescribir las reglas de mod_rewrite al rewrite de nginx. Vamos a ver unos ejemplos de como transformar las reglas entre los servidores web.
Una regla similar a la siguiente de mod_rewrite de Apache:
RewriteRule ^/home.html /home_2009.html [L]
Su transformación resulta casi directa:
rewrite ^/home.html /home_2009.html last;
Un caso que no resulta tan trivial es si queremos comparar el hostname con el que se ha accedido. Por ejemplo, para obligar a acceder con las “www” en Apache sería:
RewriteCond %{HTTP_HOST} !^www.systemadmin.es$ [NC]
RewriteRule ^(.*)$ http://www.systemadmin.es$1 [R=301,L]
Mientras que con nginx deberemos usar el operador if con los siguientes operadores:
- ~ para comparar considerando mayúsculas y minúsculas, siendo la negación (no igual) el operador !~
- ~* para comparar sin considerar mayúsculas o minúsculas. Por ejemplo, “nginx” sería igual que “NginX“, siendo la negación (no igual) el operador !~*
- Con -f comprobamos la existencia de un fichero, sinendo la negación el operador !-f
- Con -d comprobamos la presencia de un directorio, sinendo la negación el operador !-d
- Con -e comprobamos la presencia de un fichero, directorio o enlace simbólico, siendo la negación el operador !-e
- Con -x comprobamos si un fichero ex ejecutable, siendo la negación el operador !-x
Para el caso del ejemplo se podría usar el operador de no igual ignorando las mayúsculas para realizar un redirect:
if ($host !~* ^www.systemadmin.es$)
{
rewrite ^(.*)$ http://www.systemadmin.es$1 permanent;
}
Con el condicional if también podemos dejar de evaluar reglas de rewrite si se trata de contenido estático. Por ejemplo, en mod_rewrite haríamos algo similar a:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule . /index.php [L]
Con el rewrite de nginx podemos hacer lo siguiente:
if (-f $request_filename)
{
break;
}
Mediante esta simple regla evitaremos que realize dos accesos innecesarios al sistema de ficheros:
/imagenes/ejemplo.jpg/index.html FALLO /imagenes/ejemplo.jpg.html FALLO /imagenes/ejemplo.jpg ENCONTRADO
Para el caso de querer aplicar ciertas reglas solo para un subconjunto de ficheros usando su extensión, en Apache haríamos uso de FilesMatch:
<FilesMatch "\.jpg$"> ... </FilesMatch>
En nginx deberemos usar la directiva location con una expresión:
location ~* ^.+\.jpg$
{
...
}
En este caso hacemos una comparación ignorando mayúsculas con la expresión regular “^.+\.jpg$“.
Para realizar la comparación con un conjunto de expresiones también sería muy similar al caso de Apache:
location ~* ^.+\.(css|js|gif|jpe?g|png|ico)$
{
...
}
Relacionados
Imprimir
Deja un comentario: