systemadmin.es > LAMP y web > Cambiando de mod_rewrite de Apache a rewrite de nginx

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)$
{
...
}

Deja un comentario:

XHTML - Tags permitidos:<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>