El módulo rewrite nos va a permitir acceder a una URL e internamente estar accediendo a otra. Ayudado por los ficheros .htaccess, el módulo rewrite nos va a ayudar a formar URL amigables que son más consideradas por los motores de búsquedas y mejor recordadas por los humanos. Por ejemplo estas URL:

www.dominio.com/articulos/muestra.php?id=23
www.dominio.com/pueblos/pueblo.php?nombre=utrera

Es mucho mejor escribirlas como:

www.dominio.com/articulos/23.php
www.dominio.com/pueblos/utrera.php

Ejemplo 1: Cambiar la extensión de los ficheros

Si tenemos el siguiente fichero php operacion.php, podríamos usarlo de la siguiente manera:

    http://www.pagina1.org/operacion.php?op=suma&op1=6&op2=8

Y si queremos reescribir la URL y que usemos en vez de php html, de esta forma:

    http://www.pagina1.org/operacion.html?op=suma&op1=6&op2=8

Para ello activamos el mod_rewite, y escribimos un .htaccess de la siguiente manera:

    Options FollowSymLinks
    RewriteEngine On
    RewriteBase /
    RewriteRule ^(.+).html$ $1.php [nc]

El flag [nc] lo ponemos para no distinguir entre mayúsculas y minúsculas.

Esto puede ser penalizado por los motores de búsqueda ya que podemos acceder a la misma página con dos URL distintas, para solucionar esto podemos hacer una redirección:

    RewriteRule ^(.+).html$ $1.php [r,nc]

Ejemplo 2: Crear URL amigables

Creando una URL amigable podríamos llamar a este fichero de la siguiente manera:

    http://www.pagina1.org/suma/8/6

Escribimos un .htaccess de la siguiente manera:

    Options FollowSymLinks
    RewriteEngine On
    RewriteBase /
    RewriteRule ^([a-z]+)/([0-9]+)/([0-9]+)$ operacion.php?op=$1&op1=$2&op2=$3

Ejemplo 3: Uso del RewriteCond

La directiva RewriteCond nos permite especificar una condición que si se cumple se ejecuta la directiva RewriteRule posterior. Se pueden poner varias condiciones con RewriteCond, en este caso cuando se cumplen todas se ejecuta la directiva RewriteRule posterior.

Como vemos en la documentación podemos preguntar por varios parámetros, entre los que destacamos los siguientes:

  • %{HTTP_USER_AGENT}: Información del cliente que accede. Por ejemplo, podemos mostrar una página distinta para cada navegador:

      RewriteCond %{HTTP_USER_AGENT} ^Mozilla
      RewriteRule ^/$ /index.max.html [L]
    
      RewriteCond %{HTTP_USER_AGENT} ^Lynx
      RewriteRule ^/$ /index.min.html [L]
    
      RewriteRule ^/$ /index.html [L]
    
  • %{QUERY_STRING}: Guarda la cadena de parámetros de una URL dinámica.Por ejemplo:

    Teníamos un fichero index.php que recibía un parámetro lang, para traducir el mensaje de bienvenida.

      http://www.pagina1.org/index.php?lang=es
    

    Actualmente hemos cambiado la forma de traducir, y se han creado distintos directorios para cada idioma y dentro un index.php con el mensaje traducido.

      http://www.pagina1.org/es/index.php
    

    Sin embargo se quiere seguir utilizando la misma forma de traducir.

      RewriteCond %{QUERY_STRING} lang=(.*)
      RewriteRule ^index.php$ /%1/$1
    
  • %{REMOTE_ADDR}: Dirección de destino. Por ejemplo puedo denegar el acceso a una dirección:

      RewriteCond %{REMOTE_ADDR} 145.164.1.8
      RewriteRule ^(.*)$ / [R,NC,L]
    

Updated: