Apuntes de mod_rewrite

20 septiembre 2012 at 15:29 by Adrián Pérez

httpd ApacheEste post es una breve introducción a mod_rewrite, que puede servir como punto de partida, pero que no servirá ni mucho menos, como manual ni como guía. Por favor, mira las fuentes al final del mismo, para acceder a las fuentes originales y ampliar la información sobre mod_rewrite.

Mod_rewrite es uno de los módulos de Apache más importantes. Nos permitirá manipular urls (reescribiendo urls al vuelo), redirigir una url a otra o invocar un proxy interno, mediante una serie de reglas y condiciones.

En primer lugar, activaremos el motor de reescritura (en el .htaccess o en el virtualhost correspondiente), en el caso de que esté instalado mod_rewrite. Una vez activado, pondremos las reglas a continuación:

<IfModule mod_rewrite.c>
RewriteEngine On
## Aquí las reglas
</IfModule>

Una primera regla que podemos usar es RewriteBase, la cual nos permitirá incluir en todas las urls que le sigan, un prefijo común. Hay que tener en cuenta, que no se deberá incluir el dominio en las reglas, excepto en aquellas en las que sea necesario (por ejemplo en redirecciones 301), bastará con usar las direcciones relativas. Por ejemplo:

RewriteBase /pagina/
RewriteRule ^index.xml$ xml.php?generar=xml

El ejemplo anterior, estará reescribiendo las 2 urls anteriores, equivaliendo a:

RewriteRule ^/pagina/index.xml$ /pagina/xml.php?generar=xml

Otra regla es RewriteCond, la cual permite definir condiciones que se deberán cumplir, para que se lleve a cabo una reescritura. Después de una regla RewriteCond, deberá seguirle otra regla RewriteCond o una RewriteRule. Si una regla RewriteCond sigue a otra RewriteCond, funcionará como AND y por lo tanto, se deberán cumplir ambas condiciones para que se realize la reescritura. Se escribirá [OR] al final de una RewriteCond para indicar que bastará con que se cumpla una condición o la siguiente. Si no se cumplen las condiciones, no se ejecutará la RewriteRule que les siga.

RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]

La regla más importante de mod_rewrite, es RewriteRule, la cual se encarga de la reescritura. La sintaxis es la siguente:

RewriteRule <secuencia a buscar> <sustitución> [FLAGS]

Así por ejemplo, la siguiente regla, buscará exactamente la cadena "/catalogo/armario.html" de principio (^) a fin ($) y la sustituirá por " /catalogo.php?cat=1", sin importar mayúsculas y minúsculas ([NC]).

RewriteRule ^/catalogo/armario.html$ /catalogo.php?cat=1 [NC]

Todos los flags están definidos en la documentación oficial. Destacan:

  • [NC] (nocase): no distingue entre mayúsculas y minúsculas.
  • [L] (last): si la regla se ejecuta, no continúa revisando el resto de reglas.
  • [F] (forbidden): devuelve un "403 Forbidden status".
  • [R=3XX] (redirect): causa un HTTP Redirect, con el código indicado (del 300 al 400). Normalmente se usa junto al flag "L". Ej. [R=301,L].

Mod_rewrite usa expresiones regulares para la definición de las reglas. En perlenespanol explican con un buen ejemplo el uso de expresiones regulares básicas en mod_rewrite, que reproduzco a continuación:

RewriteRule ^([a-zA-Z]+)/([a-zA-Z]+)/([a-zA-Z0-9]+).htm$ cgi-bin/aplicacion_ropa.cgi?tipo=$1&sexo=$2&talla=$3 [L,NC]
[Fuente del ejemplo: perlenespanol]

Básicamente buscamos 3 variables en la url de búsqueda que le pasaremos a la url a reescribir, como $1, $2 y $3. Las variables a buscar se indican entre paréntesis. Es decir, tenemos 3 valores entre paréntesis - por ejemplo "([a-zA-Z]+)"- en la url de búsqueda, que se pasarán a la url de reescritura, como $1, $2 y $3. El resto, ya es el funcionamiento propio de las expresiones regulares.

Y a partir de aquí, mucho, mucho más en la documentación oficial de mod rewrite.

 

Fuentes:

http://www.php-hispano.net/articulos/reescribir-direcciones-con-mod-rewrite.html

http://perlenespanol.com/articulos/archivo/000180.html

RewriteBase /pagina/
RewriteRule ^index.xml$ xml.php?generar=xml

Flickr! Foto por US Mission Geneva