De lo que se viene en llamar WEB 2.0 (me gusta más el termino de Web Social), probablemente las URL amigables sean la parte que más nos faciliten la vida y mas disfrutemos.
¿Que es una URL amigable? Es facil. Tradicionalmente, cuando solicitamos a una pagina que nos muestre una determinada información, lo que hacemos es asignar una serie de valores a una serie de variables. Estas variables son pasadas a la página a traves de la URL, la pagina las lee, procesa y muestra la información solicitada.

Por ejemplo: Si solicitamos a Google páginas en las que aparezca el término “miserable“, lo que hacemos es asignar a la variable llamada “q” el valor “miserable” y enviarselo a Google tal como: http://www.google.es/search?q=%22miserable%22

Si además queremos que la busqueda se limite páginas en español, asignamos la variable “meta” el valor “lr=lang_es”

http://www.google.es/search?q=%22miserable%22
&meta=lr%3Dlang_es

(los caracteres especiales como comillas, espacios, signo igual, deben ser traducidos).

Todo muy bien, muy claro. Sinembargo conforme las paginas iban admitiendo más y más variables con las cuales filtrar la información a mostrar, el resultado son URL extremadamente largas, incomodas de manejar y no digamos de memorizar. La usabilidad de dichas URLs se aproxima a cero. Por ejemplo, sin ir más lejos hace unos dias me pasaron una dirección a un concurso de infografia, esta es la dirección:

http://www.sicarm.es/servlet/integra.servlets.ServletLink?
sit=c%7C545%7Cm%7C2076%7C&cad=Reportajes
Portal$$Programa$8273$DETALLE_REPORTAJESPADRE$%7
CReportajesPortal$Animaci%F3n%20Digital$8273$
DETALLE_REPORTAJESPADRE$%7CReportajesPortal$Programa%20
(Animaci%F3n)%20-%20Zona%20de%
20Exposici%F3n$9219$DETALLE_REPORTAJESABUELO

De tan larga, tuve hasta problemas para copiar la dirección desde Gaim (si os interesa el concurso, haced Clik AQUI).

A lo ibamos, si se quería hacer una Web intuitiva, lógica y accesible había que solucionar esto y aqui es donde entra un fabuloso módulo que usan los servidores Web Apache, mod_rewrite, un modulo ya muy extendido (afortunamente) por todos los servidores Linux y del que hace uso WordPress (y casi todos los sistemas de weblogs) y que con unos muy breves conocimientos podemos hacer uso para facilitarnos la vida (por defecto, WordPress se instala sin hacer uso de las URL amigables ya que todavía algunos servidores Web no tienen esta funcionalidad activa).

Básicamente lo que hace el módulo mod_rewrite es leer la URL requerida por el usuario y “traducirla” a un lenguaje comprensible por la pagina.

Esto tiene una serie de ventajas obvias y otras no tan evidentes:

1/ El mucho más facil recordar una dirección y más intuitivo averiguar otras.

Por ejemplo, en esta web podeis consultar mis comentarios en la dirección: http://www.trebol-a.com/estadisticas/?stats_author=Trebol-A , no hace falta ser un lince para darse cuenta de que basta con cambiar “Trebol-A” para consultar los comentarios de otro usuario:
http://www.trebol-a.com/estadisticas/?stats_author=miguel
http://www.trebol-a.com/estadisticas/?stats_author=monica

2/ Se evitan problemas

Algunos motores de busqueda llevan malamente la indexación de URLs muy largas y/o cargadas con caracteres especiales, o sencillamente se hace casi imposible manejar URL tan largas. Como muestra la dirección del concurso que daba anteriormente. Si tratais de enviarla a alguien por correo, muy probablemente la recibirá mal formateada ya que el programa de correo provocará un salto de linea, con lo cual a quien la reciba le llegará una dirección no-valida.

3/ Se facilita la actualización del sitio

Para acceder a la galería de imagenes de esta web se dirige al navegador hacia http://fotografia.trebol-a.com ó bien http://www.trebol-a.com/photos. Si mañana decido cambiar el sistema de gestión de la galería (actualmente falbum) la dirección permanece invariable, ya que bastaría con corregir el contenido del archivo .htaccess

4/ Se reduce el numero de errores “404:Page Not Found”

Si como en mi caso, has cambiado la estructura de la web recientemente ó bien observas que llegan enlaces mal dirigidos a la web, bastaría con añadir una nueva regla al archivo .htaccess que rediriga las solicitudes a una url válida.

Jugando con .htaccess

Antes de continuar deberias saber que una mala manipulación del archivo .htaccess puede impedir el acceso a tu sitio. Si en tu sitio existe un fichero llamado .htaccess haz una copia de seguridad para recuperarla en caso de error.

El archivo .htaccess se ubica dentro de cada uno de los directorios publicos de tu sitio y en se guardan las reglas y condiciones que se van aplicar a dicho directorio. Desde la solicitud de contraseñas de acceso, el permiso/prohibición para indexar/listar el contenido del directorio ó (la que nos interesa) la “correción” de URLs que se soliciten dentro del directorio.

Abre con un editor de texto tu fichero .htaccess ó crea uno sino existe (el punto delante indica en linux que es un archivo oculto, si estás en Windows probablemente tengas problemas para crear el archivo). Escribe lo siguiente:
<IfModule mod_rewrite.c>
</IfModule>

Entre esas lineas introduciremos las reglas que se ván a aplicar al directorio siempre y cuando el modulo esté activo. Ahora activamos la reescritura y aplicamos una regla simple:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule . /index.php [L]
</IfModule\>

La sintaxis es la siguiente:
RewriteRule url-solicitada url-destino [bandera]
url-solicitada es usualmente una expresión regular, si se cumple continua la ejecución de la regla.
url-destino, dirección hacia donde dirigir el navegador caso de cumplirse la regla.
bandera, condiciona la ejecución de la regla

La regla anterior envia al “index.php” situado en el directorio raiz ( / ) de nuestro sitio cualquier solicitud (.) que llegue al directorio, a continuación la bandera (L) finaliza la ejecucción si la regla se cumple.

Según la regla anterior, cualquier solicitud que llegue al directorio donde se encuentre dicho .htaccess será redirigida a index.php, INDEPENDIENTEMENTE de que el archivo solicitado exista ó no. Es decir, si disponemos de un archivo llamado fotos.php ó avatar.jpg estos serian innaccesible ya que de forma automática el servidor dirige TODO a index.php.
Para evitar esto, deberiamos añadir una condicion a la regla:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule . /index.php [L]
</IfModule\>

RewriteCond, si el requerimiento ( %{REQUEST_FILENAME} ) es un fichero innexistente ( !-f ) ejecuta la regla.

Siguiendo esto, podríamos filtrar las entradas a nuestro sitio leyendo los referers de la visita. Asi por ejemplo, si una entrada a nuestro sitio llega con un referer (falso) que contiene (sex|drugs|rock\&roll) lo cual es signo más que probable de spambot lo redirigiremos a otra pagina especial
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_REFERER} (sex) [NC,OR]
RewriteCond %{HTTP_REFERER} (drugs) [NC,OR]
RewriteCond %{HTTP_REFERER} (rock\&roll) [NC]
RewriteRule . http://www.microsoft.com [L]
</IfModule\>

En el caso anterior la bandera [NC] indica que la condicion es no-sensible a mayusculas, trata de igual manera SEX, sex ó Sex.

Para facilitar la vida a nuestras visitas podriamos leer sus solicitudes de documentos, de tal manera:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)(.htm|.html|.php)$ index.php/?s=$1 [NC,L]
</IfModule\>

Según lo anterior, cualquier solicitud de archivo htm, html ó php que se haga y no se encuentre produciría su busqueda automática. Y redondeandolo más:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)(.gif|.jpg|.jpeg|.png|.bmp) http://www.flickr.com/photos/MI-USER-EN-FLICKR/tags/$1/ [NC,L]
RewriteRule ^(.*)(.htm|.html|.php)$ index.php/?s=$1 [NC,L]
</IfModule\>

Segun la anterior regla redirigimos cualquier busqueda infructuosa de archivos de imagen (gif, jpg, jpeg, png ó bmp) a nuestra cuenta flickr, concretamente intentaría mostrarlo en nuestra lista de tags.

Para seguir profundizando en mod_rewrite: