Muchos se preguntarán, ¿qué son las urls amigables y para qué sirven?, ¿realmente son necesarias?.

Pongamos un ejemplo práctico para ver la importancia que tienen las urls amigables dentro de un desarrollo web.

Si os fijais en un perfil de usuario de la popular red social Twitter, podéis ver que si mi usuario es “sombeo_oficial“, puedo acceder rápidamente a mi perfil desde la dirección “https://twitter.com/sombeo_oficial“. Eso amigos, es una url amigable, algo rápido y sencillo para acceder a un contenido de la página (en este caso al perfil del usuario) tanto para una persona como para un buscador.

Anteriormente, cuando surgió Facebook y se empezó a utilizar, los perfiles de los usuarios no disponían de urls amigables, por lo que para acceder a un perfil de usuario debíamos hacerlo a través de una url como esta “http://www.facebook.com/profile.php?id=1304880680“, algo que como podéis ver no es nada sencillo de recordar para una persona, ni tampoco muestra información muy concreta para un buscador.

Actualmente Facebook ya utiliza urls amigables y podemos ver que para acceder a un perfil de usuario ya símplemente con poner su nombre de usuario accedemos a él, sería algo así “http://www.facebook.com/sombeo” tanto para perfiles, como páginas, eventos, etc.

Para el posicionamiento de un sitio web es muy importante tener las direcciones o urls de forma amigable para los buscadores. Lo que incrementará considerablemente nuestro tráfico por parte de éstos. Ya que los buscadores además de fijarse en el título de la página, descripción, etcétera, también se fijan en la url y no es lo mismo tener una url amigable que diga “http://www.miweb.com/productos/monitor-17-pulgadas-samsung” a que sea “http://www.miweb.com/producto.php?id=2154“.

Después de esta explicación, empecemos:

Primero necesitamos limpiar éstas direcciones de carácteres inválidos como las tíldes, eñes y demás carácteres especiales. Para ello podemos utilizar la siguiente función PHP:

function urls_amigables($url) {

      // Tranformamos todo a minusculas

      $url = strtolower($url);

      //Rememplazamos caracteres especiales latinos

      $find = array('á', 'é', 'í', 'ó', 'ú', 'ñ');

      $repl = array('a', 'e', 'i', 'o', 'u', 'n');

      $url = str_replace ($find, $repl, $url);

      // Añadimos los guiones

      $find = array(' ', '&', '\r\n', '\n', '+');
      $url = str_replace ($find, '-', $url);

      // Eliminamos y Reemplazamos otros carácteres especiales

      $find = array('/[^a-z0-9\-<>]/', '/[\-]+/', '/<[^>]*>/');

      $repl = array('', '-', '');

      $url = preg_replace ($find, $repl, $url);

      return $url;

}

Esta función la usaremos a la hora de crear los enlaces en nuestra página web, para evitar posibles problemas.

Ahora vamos con lo importante, deberemos crear un archivo de texto plano .htaccess en el directorio raíz con una estructura específica, para que nuestro servidor Apache sepa como interpretarlo.

  • La primera línea de este archivo debe ser la siguiente:
RewriteEngine on
  • Después ponemos las dos siguientes líneas:
RewriteCond %{SCRIPT_FILENAME} !-d  
RewriteCond %{SCRIPT_FILENAME} !-f  

Estas dos líneas son muy importantes, lo que hacen es decirle a Apache que sólo puede crear direcciones amigables si el directorio especificado no existe. Esto evita por ejemplo las reglas que coincidan con “http://miweb.com/imagenes/logo.png“. La primera línea evita los directorios (!-d) y la segunda línea los archivos (!-f).

  • Ahora vamos a reescribir una dirección para hacerla amigable.

Tenemos la siguiente dirección:

index.php?seccion=php&articulo=3

Podemos hacerla amigable y quedaría así:

articulo/php/3/urls-amigables-con-htaccess-y-php

Pues para poder crear está dirección amigable, a continuación de la última línea que tenga el archivo .htaccess deberemos poner una regla, en el caso de la dirección anterior sería ésta:

Rewriterule ^articulo/(.+)/([0-9]+)/(.+)$ index.php?seccion=$1&articulo=$2

Expliquemos un poco que significa cada cosa:

  • Rewriterule significa que vamos a crear una regla para reescribir una dirección.
  • El carácter ^ significa el comienzo de la expresión.
  • El primer valor (.+) significa que ahí va el primer valor/variable que pasamos por la url con el método GET. A estas variables se las llaman $1, $2, $3, dependiendo de su posición.
  • El valor ([0-9]) indica que ahí puede ir cualquier número del 0 al 9 pudiéndose repetir todas las veces que sean necesarias.
  • El segundo valor (.+) hace lo mismo que el primero pero con la última posición de la dirección.
  • El carácter $ significa que ahí termina la expresión.

Podemos hacer un infinidad de reglas distintas con diferentes patrones utilizando expresiones regulares.

Entonces cuando en el código de mi página web vaya a crear un enlace lo haría poniendo la url amigable directamente. Antes de todo ésto, cuando hagamos por ejemplo la consulta a la base de datos, mostraremos alguno de estos datos en la url para crear nuestra url amigable.

La consulta sería algo así:

SELECT id, titulo, descripcion, seccion FROM productos WHERE id = 3

Después de hacer la consulta desde PHP y devolver los valores quedaría algo así:

//recibo los valores de la consulta en diferentes variables
$seccion = $row['seccion'];
$id_articulo = $row['id'];

//limpiamos el título con la función que hay al comienzo del artículo
$titulo = urls_amigables($row['titulo']);

echo '<a href="articulo/'.$seccion.'/'.$id_articulo.'/'.$titulo.'" title="'.$row["titulo"].'"></a>';

Esto crearía nuestra url amigable utilizando los valores que tenemos en nuestra base de datos.

Para evitar problemas con la raíz al utilizar las urls amigables con direcciones relativas, es recomendable utilizar el siguiente código dentro del “<head>” de nuestra página:

<base href="http://www.miweb.com/" />

Y listo, con todo esto ya tendríamos nuestras urls amigables funcionando correctamente. Ya saben, cualquier duda tan sólo pregunten.

Sobre Reacción Estudio

Somos un estudio informático formado por jóvenes centrados en el desarrollo web, el diseño gráfico y la fotografía. Puedes solicitar presupuesto para tu proyecto a través de nuestra página web o por teléfono, pero en este blog hablaremos de todo lo que engloba el desarrollo web a día de hoy.


  • Sebastián López

    no tienes idea cuanto te lo agradesco =)

  • Tienda Portalgame

    hola amigo tengo una duda que archivo creo para el llamado de la base de datos y adonde llamo la funtion php

    • Alberto
      • Tienda Portalgame

        amigo como estas gracias por responder veo tu tutorial muy bueno pero tengo mi problema en la pregunta que te hice anterior dije que no sabia a donde hago la consulta a la base de datos ya que no dices y la function urls_amigables($url) la puedo hacer de cualquier archivo php y despues la llamo esa es mi gran duda donde llamo esa function php y si tengo la base de datos conectada al servidor pero mi idea es donde hago la consulta y en donde llamo la function
        estoy loco le e dado mil mil bueltas a tu esplicacion y noe podido, mi url es esta
        http://localhost/tienda/productos.php?cat=14

        y la idea es http://localhost/tienda/computadores/disco duros/disco-500-gb
        computadores/es de categorias de mi web
        disco duro / es de subcategorias
        disco-500-gb / es de mi base de datos es una tienda online

        y mil gracias por responder ¡¡¡¡¡¡¡eres mi unica guia please

        • Alberto

          La función “urls_amigables()”, la puedes poner en cualquier archivo php, siempre que luego lo incluyas donde lo vayas a llamar.

          Es decir puedes crear un archivo llamado “seo.php” y luego hacer un include_once(“seo.php”); en tu archivo productos.php.

          Y en el archivo productos.php llamar a la función “urls_amigables()”.

          • Tienda Portalgame

            mil gracias por tu ayuda, si esa parte es como la que mas entiendo pero el archivo .htaccess no tiene que hacer el llamado de la function php y lo otro es de donde hago la consulta para que mi archivo ,htaccess me ponga los url de mi base de datos mil gracias de nuevo

          • Alberto

            El archivo .htaccess se pone en el directorio raiz de tu web, no hay que incluirlo en ningún lado.

  • http://www.misabogadoss.com Yickson Ramirez

    Gracias amigo, por fin un verdadero tutorial que explica lo de las URL amigables como debe ser!!!

  • Pingback: Urls Amigables (Desarrollo paginas web) | Mucha Informacion |()

  • Day Herrera Hardsome

    Hice lo del tutorial, todo bien, pero ahora no me reconoce los estilos css, que debo hacer?

    • Alberto

      Eso es porque estás incluyendo los archivos CSS a través de una ruta relativa, utiliza rutas absolutas para incluir tus archivos de estilo y se solucionará el problema.

  • Leo Luna R

    Hola buenas tardes, tengo una duda ¿En qué ruta guardo el script PHP el de url_amigables? muy buen tutorial muchas gracias

  • Enrique de la Torre

    Hola, , me funciona perfecto, sólo tengo un problema al intentar convertir los acentos y ñ, no me los convierte en el primer str_replace y como consecuencia en el ultimo preg_replace me los elimina. Gracias

  • Obed

    Muy agradecido con tu post :-)

  • legendchieff007

    porque no pones subes el proyecto donde lo implementas ya que no esta muy claro

  • Elmer Cusanero Guicoy

    hasta ahora me a funcionado bien pero como le haría para poder controlar errores en caso de que el valor de la variable get no sea correcta

    es desir mi variable se llame categoría
    y que categoría = computadoras
    como controlaría el error si el usuario toca la url y en lugar de computadoras coloque otra cosa nose si me doy a entender

    por cierto buen tutorial

  • Roberth J. Sandoval

    Excelente aporte me ayudó bastante a cambiar las URLs de mi proyecto y mostrarlas como amigables. Muchas gracias :)

  • Alejandro Garcia

    De lugar de ingresar a:
    index.php?seccion=12&articulo=15

    Ingresas de la siguiente manera
    articulo/12/15/Hola-Alejandro

    con el ejemplo de arriba.. Saludos

  • sebastian

    disculpen tengo una pagina y permite ingresar con mas de un / digamos http://pruebas.com//noticias.
    Hay alguna forma que yo pueda evitar eso? digamos con el .htaccess

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies.     ACEPTAR