Creación de URL amigables

¡Comparte nuestro contenido!

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. 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

A 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]

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 parametro, 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

  1. [L] - Detenerse en cuanto cumpla la última regla
  2. [QSA] - Añadir cadenas de texto al final de la expresión
  3. [F] - Aplicar un error 403 Forbidden
  4. [N] - Siguiente instrucción
  5. [R=301] - Aplicar una redirección 301
  6. [NC] - No hacer distinción entre mayúsculas y minúsculas

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.

¡Comparte nuestro contenido!

Israel García

Docente, IT Manager, Blogger & Developer. Escribo por diversión, educo por pasión. | Grandstanding is not my thing.

También te podría gustar...

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

shares