Blog de Jose Alvarado

Jose Alvarado

Venezolano. 21 años. Estudiante de ingeniería civil y desarrollador web.

URL Amigables con PHP y HTACCESS

hace 17 meses por
josealvaradoo

Cuando entramos a un sitio web y vemos su URL podemos encontrarnos con dos cosas, una URL con símbolos por ejemplo post.php?id=5 o algo más presentable como post/mi-primer-post Esto último se le llamada URL amigables porque se le hace al usuario más fácil de recordar, más amigable. Y esto en PHP se logra con unas cuantas líneas de código y modificando el archivo htaccess.

Activando el motor de reescritura

Debemos crear el archivo .htaccess y activar el motor de reescritura de la siguiente mantera.

RewriteEngine On

Creando reglas de reescritura

Una vez activado, ahora se deben crear reglas de reescritura, y no es más que colocar que páginas queremos como URL amigables y la referencia a que archivo.

RewriteRule     ^contacto    contacto.php

Esto quiere decir que si escribimos tudominio.com/contacto nos mostrará lo que antes mostraba tudominio.com/contacto.php. Pero hecho esto nos podemos encontrar con un detalle, los estilos. Si en nuestro archivo contacto.php tenemos los estilos con URL relativa, por ejemplo <link href="css/styles.css"> nos daremos cuenta que al entrar con la URL amigable /contacto los estilos no se aplicarán.

Arreglando los estilos

¿Por qué ocurre esto? Pues porque al cambiar la URL de forma que tenemos un / el navegador lo interpreta como si estamos en una subcarpeta que no es la carpeta raíz.

Para esto debemos colocar la dirección absoluta en donde se encuentran los estilos. La dirección absoluta es toda la dirección de tu dominio más la carpeta donde se encuentra el archivo, más el archivo. Por ejemplo http://tudominio.com/css/styles.css. Y con esto nos libramos el detalle de los estilos.

Arreglando los enlaces <a>

Debemos tener en cuenta que si hemos modificado las URL, también debemos hacerlo en los enlaces <a> para que el usuario cuando haga click vaya a la página con la URL amigable. Si antes hacíamos referencia a un archivo como contacto.php ahora se hace sin la extensión, como hayamos colocado en regla de reescritura contacto.

¿Y si tenemos páginas con parámetros?

Para crear reglas de reescritura que reciben parámetros es sencillo, y muy usado en las páginas que tienen artículos como los blogs. Por ejemplo si el parámetro es un ID nuestra URL sin ser amigable sería /post.php?id=4 pero siendo amigable sería /post/4. Esto se hace de la siguiente manera.

RewriteRule    ^post/(.+)$    post.php?id=$

¿Y dónde usamos PHP?

Si nos damos cuenta en ningún momento hemos usado PHP. Sin embargo, en el ejemplo anterior con los post lo hice con el ID, pero la forma de hacerlo correctamente es con el título separado por guiones (-), de ésta forma el usuario podrá recordar mejor la dirección del artículo y a los ojos de Google esto vale y nos ayuda positivamente en el SEO.

Creando URL amigables para artículos

La idea de esto, es que al abrir un artículo la dirección URL sea algo como /post/cuidar-animales.html siendo la URL verdadera /post.php?p=cuidar-animales.html

Para esto debemos tener un campo en nuestra base de datos que nos permita guardar el titulo de manera fraccionada, separada por guiones y opcionalmente, agregarle la extensión ".html" que simula que estamos abriendo un archivo HTML aunque no es así.

Este campo lo llamaré url_amigable. Será de tipo VARCHAR y tendrá más capacidad que el campo titulo.

Ahora debemos asegurarnos de que las letras sean todas en minúsculas, reemplazar los caracteres extraños por caracteres simples y reemplazar los espacios por guiones. Yo uso una función en PHP que comparto contigo para facilitarte el trabajo. Ésta función debes aplicarla antes de subir el artículo a la base de datos.

function urlAmigable(string $string): string {
    $string= utf8_decode($string);
    $string= strtolower($string);
    $string = str_replace(' ', '-', $string);
    $string = str_replace('?', '', $string);
    $string = str_replace('+', '', $string);
    $string = str_replace(':', '', $string);
    $string = str_replace('??', '', $string);
    $string = str_replace('`', '', $string);
    $string = str_replace('!', '', $string);
    $string = str_replace('¿', '', $string);
    $originales = "ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûýýþÿ??";
    $modificadas = "aaaaaaaceeeeiiiidnoooooouuuuybsaaaaaaaceeeeiiiidnoooooouuuyybyRr";
    $string = strtr($string, utf8_decode($originales), $modificadas);
return $string;

}

Al aplicarle esto al titulo, nos arrojará un resultado como el siguiente.

$titulo = "Hola mundo"
$url_amigable = urlAmigable($titulo); // hola-mundo

Entonces, si le agregamos un ".html" quedaría

$url_amigable = $url_amigable . ".html";

Finalmente esto lo agregamos a la base de datos. Si tenemos un enlace que nos lleve hacia el artículo, lo que debemos mostrar sería, dependiendo de como le hayamos colocado en la regla de reescritura.

<a href="post/<?php echo $url_amigable; ?>">
    <?php echo $titulo; ?>
</a>

Así se trabajaría con URL Amigables para páginas dinámicas que reciben parámetros, en un ejemplo de artículos de blog.