La URL semántica o como popularmente se le conoce URL amigable, es aquella que trata de ser lo más entendible posible para el usuario, de forma que al leerla este pueda darse una mejor idea de lo que está viendo o haciendo.
Tabla de Contenido
¿Qué es una url amigable?
Las URLS amigables son también un buena forma de quitar de la vista del usuario toda la parafernalia de variables que pasamos por el método GET, de forma que para un visitante es mejor leer:
http://cablenaranja.com/creacion-urls-amigables-con-htaccess
En lugar de leer algo como:
http://cablenaranja.com/seccion.php?sid=1&t=20
Para asegurar que nuestros proyectos y aplicaciones utilicen URL semántica o amigable, vamos a trabajar con algunas opciones de mod_rewrite un módulo de Apache que nos permite definir reglas que se ajusten a nuestras necesidades. Significa que vamos a modificar nuestro archivo .htaccess o crear uno si no lo tenemos.
Crear o editar el archivo .htaccess
Como vamos a utilizar mod_rewrite, lo primero es verificar si realmente está funcionando, eso lo logramos con la instrucción:
<IfModule mod_rewrite.c>
Ahora necesitamos abrir la posibilidad de hacer reescritura.
RewriteEngine on
También hay que decirle que vamos a iniciar desde algún punto de nuestro sitio, lo normal es que sea la raíz.
RewriteBase /
Para poder definir las reglas de escritura según sea nuestro caso o necesidad, vamos a conocer un poco la simbología que nos va a permitir crear las cadenas o expresiones regulares que vayamos a utilizar.
- ? Cualquier caracter coincidente
- ! Negación, se puede usar como “Excepto …”
- . Cualquier caracter arbitrario
- – No hacer o no incluir
- + Uno o más ocurrencias del caracter precedente
- * Cero o más del caracter precedente (Comodín)
- | Operador lógico or
- \ Caracteres especiales como “\.” para mostrar un punto
- /* Cero o más diagonales
- ^$ Cadena de texto vacía
- ^.*$ Cualquier coincidencia
- () Agrupar
- [] Coincidir
- ^ Comienzo de una expresión
- $ Final de una expresión
De esa forma podemos definir cosas como: sólo número [0-9] o sólo letras [a-zA-Z] o letras y números [a-zA-Z0-9] entre otras cosas. Por ejemplo:
http://cablenaranja.com/seccion/9/tutoriales
El paso para conseguir algo como eso sería la siguiente regla:
^seccion/([0-9]+)/([a-zA-Z]+)/?$
Analicemos un poco:
- ^seccion Comienza con la cadena de texto sección
- ([0-9]+) El siguiente valor es un grupo de números entre 0 y 9 donde cada valor siguiente es similar al precedente.
- ([a-zA-Z]+]) Grupo de letras mayúsculas y minúsculas donde cada valor siguiente es similar al precedente.
- /?$ La / al final, es opcional.
Para dejar esto muy claro en nuestro archivo .htaccess, hemos de escribir la siguiente regla:
RewriteRule ^seccion/([0-9]+)/([a-zA-Z]+)/?$ seccion.php?id=$1&$nombre=$2 [L]
¿Qué es RewriteRule?
RewriteRule es la sentencia a utilizar para aplicar la regla que hemos definido. Importante notar que al final de la regla agregamos el archivo que va a gestionar nuestra url. Los valores $1 y $2 significan que tenemos dos valores, una para la expresión ([0-9]+) y otra para la expresión ([a-zA-Z]+) y que hemos puesto en las variables GET llamadas id y nombre (pueden llamarse como sea), el paramétro [L] indica que en cuanto se cumpla está regla, se detenga. Entonces, nuestro archivo .htaccess queda así hasta el momento:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteBase /
RewriteRule ^seccion/([0-9]+)/([a-zA-Z]+)/?$ seccion.php?id=$1&$nombre=$2 [L]
</IfModule>
Respecto a ese último parámetro, se llama bandera y no es el único que existe, aquí una pequeña lista de los que a mi juicio son más útiles
- [L] – Detenerse en cuanto cumpla la última regla
- [QSA] – Añadir cadenas de texto al final de la expresión
- [F] – Aplicar un error 403 Forbidden
- [N] – Siguiente instrucción
- [R=301] – Aplicar una redirección 301
- [NC] – No hacer distinción entre mayúsculas y minúsculas
Evitar problemas con RewriteCond
Como esta regla puede causarnos conflictos con directorios (!-d) y archivos (!-f) ya existentes, vamos a aplicar dos condiciones con RewriteCond precisamente para evitarnos ese problema, eso lo vamos a poner justo antes de la regla que hemos definido:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteBase /
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteRule ^seccion/([0-9]+)/([a-zA-Z]+)/?$ seccion.php?id=$1&$nombre=$2 [L]
</IfModule>
Ahora sólo necesitamos subir este archivo a la raíz de nuestro servidor, renombrarlo como .htaccess y reiniciar apache. Para una mayor comprensión de mod_rewrite recomiendo esta Cheat Sheet.
¡Y con eso finalizamos este artículo! ¿Te ha resultado? Déjanos saber en los comentarios aquí abajo, en nuestra cuenta de twitter @cablenaranja7 o en nuestra página de facebook.
Docente, IT Manager, Blogger & Developer. Escribo por diversión, educo por pasión. | Grandstanding is not my thing.
Hola podrias ayudarme
tengo la variable asi
index.php?view=producto&product_id=88
cual seria el correcto ya que no logo hacer que funcione de ninguna manera
y por la dudas que cada seccion acepte tanto numeros letra y guienos
Saludos Mauricio, con gusto.
¿Podrías mostrarme el código del .htaccess para que lo revise y te diga que falta?
Saludos