Enlaces permanentes o pretty permalinks con htaccess y Apache
El posicionamiento en buscadores y la progresiva imposición del ecosistema web en el día a día del software, ha obligado a todos los que desarrollamos aplicaciones en la nube, a cuidar la forma en que aparecen las URL, el producto de esta tendencia son los llamados pretty permalinks. Direcciones que identifican de forma unívoca a contenido y que además en lugar de tener parámetros, tienen una cadena entendible para los humanos.
¿En qué tecnología nos podemos apoyar para llevarlos a cabo? Podemos usar nuestro lenguaje del lado del servidor o directamente también podemos usar a nuestro servidor web. Explicaré en esta entrada cómo hacer enlaces permanentes vistosos usando Apache y .htaccess. Siempre hará falta conocer algo sobre expresiones regulares o patrones. El requisito técnico es que además del servidor web, tengas instalado mod_rewrite.
Objetivo
El ejemplo que vamos a desarrollar convertirá peticiones del tipo http://misitio.com/mipagina a http://misitio.com/mipagina.php, para que podáis tener:
- http://misitio.com/contacto usando http://misitio.com/contacto.php
- http://misitio.com/sobre-mi usando http://misitio.com/sobre-mi.php
¿Útil no?
Código
Este es el código del fichero .htaccess:
Options +FollowSymLinks RewriteEngine On RewriteCond %{SCRIPT_FILENAME} !-d RewriteCond %{SCRIPT_FILENAME} !-f RewriteRule ^([a-z]+-?[a-z]+)/$ /$1.php
Explicación
Y esta la explicación, vayamos por partes, nos interesa la última línea.
- ¿Qué tenemos? Una regla
- ¿Qué partes tiene? Cabecera ParteIzquierda ParteDerecha
Veamos, la cabecera es RewriteRule y es el que indica que estamos en una regla para transformar peticiones que llegan al servidor.
La parte izquierda es la parte en la que tiene que encajar la petición. Se sigue como veis la lógica de todos los sistemas basados en reglas, parte izquierda desencadena y parte derecha acción que se desencadena.
¿Pero qué es en realidad lo que tenemos en la parte izquierda? Una expresión regular que indica:
- [a-z]+: una o más letras en minúscula
- -?: seguidas o no de un guión (para permitir expresiones del tipo “sobre-mi”)
- [a-z]+: igual que el primer punto
- (): todo lo anterior entre paréntesis para tenerlo como una sola variable
Los símbolos ^ y $ identifican el comienzo y el final respectivamente de la expresión regular.
La parte derecha es la acción que se desencadena. Reconozco cadenas del estilo: http://misitio.com/sobre-mi y con lo que he detectado y almacenado en una variable (lo que hay en la expresión regular entre paréntesis), lo tengo en la parte derecha en la variable $1. Es decir, reescribiré la URL que me han enviado de esta forma:
- Me llega: http://misito.com/sobre-mi, detecto con la expresión regular “sobre-mi” y lo almaceno en $1
- En la ejecución de la regla reescribo haciendo: lo que he recibido, terminado en .php, por lo que el servidor ejecutaría http://misitio.com/sobre-mi.php pero mostraría la URL http://misitio.com/sobre-mi
Espero que te guste. Si tienes dudas o sugerencias, te esperamos en los comentarios.