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. Son perfectas para mejorar el SEO de una página o sitio web.
¿Para que sirve una URL amigable?
Cómo se menciono arriba, son excelentes para mejorar el SEO de las páginas y sitios web, también ayudan a ocultar variables y parámetros típicos de una aplicación que pueden ser explotados por un atacante. Adicionalmente son fáciles de leer e identificar para el visitante, ya que tiene la forma:
https://tusio.com/tu-pagina-a-mostrar
En lugar de:
https://tusitio.com/?id=20&titulo=pagina
Por ejemplo:

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
En la raíz de tu sitio web, debe existir un archivo llamado .htaccess. Se trata de un simple, pero poderoso archivo de texto que usaremos para añadir instrucciones y modificar el comportamiento de nuestro sitio web, página o aplicación. Si no existe, puedes simplemente crearlo con la herramienta de texto que tengas a mano.

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://hielocreativo.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é significa 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:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteBase /
RewriteRule ^seccion/([0-9]+)/([a-zA-Z]+)/?$ seccion.php?id=$1&$nombre=$2 [L]
</IfModule>
Nuestro archivo .htaccess queda así hasta el momento:

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:
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{SCRIPT_FILENAME} !-f
Quedando como sigue:
<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>
O sea:

Una vez actualizado el archivo (o subido si estás usando un gestor de archivos) solo necesitas reiniciar apache si estás en un servidor propio. Por ejemplo, en la mayoría de las distribuciones Linux el siguiente comando será más que suficiente.
sudo systemctl restart httpd
O si estás en un panel de control de un proveedor de servicios, busca la opción para reiniciar el servicio. Para una mayor comprensión de mod_rewrite recomiendo esta Cheat Sheet.
Comentarios, dudas o preguntas
¡Y eso es todo! No olvides dejar tus comentarios, dudas y / o preguntas. Con gusto las respondemos.

Docente, blogger, developer. Editor & Copy
Sobre: #Blogging, #Excel, #VBA, #Android, #PHP, #JavaScript, #Java, #WordPress, #IoT, #Python
