Urls Amigables con PHP
Hace una semana hice un cambio en Baluart, modifique la urls de nuestros artículos por unas mucho más amigables a los buscadores.
El efecto que esto provocó en Google fue enorme, el buscador empezó a pasearse como Pedro en su casa por el Weblog e indexó casi todo su contenido. Pasamos de tener unas 5,000 páginas indexadas a más de 12,000… no me pregunten ¿por qué?, pero fue a consecuencia del cambio (de esto no hay duda).
Otro efecto positivo (si el afán es el posicionamiento en buscadores), fue la mayor atracción de visitantes pasajeros (no es mi intención hablar de estadísticas, pero aproximadamente hubo un incremento del 10% al 20% de tráfico por Google).
Por todo esto, considero que una web que desee tener presencia en los principales buscadores debe utilizar urls amigables. Y para esto, tan sólo debes seguir estos 3 pasos:
1er Paso: Creando la función PHP: urls_amigables()
El objetivo de esta función es tomar el título de la noticia y transformarlo en una frase asequible a los buscadores.
El Proceso es como sigue:
La función php recibe la variable que contiene el título del artículo, inmediatamente transforma todo su contenido a minúsculas con la función strtolower(), luego haciendo uso de la función str_replace() le quitamos las tildes a las vocales y cambiamos la ñ por n (no es necesario hacerlo con las mayúsculas porque previamente las transformamos a minúsculas). Ahora, reemplazamos algunos símbolos y espacios en blanco con guiones y finalizamos eliminando todo carácter extraño que se nos escape con la función preg_replace().
En otra palabras:
<?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ñaadimos los guiones
$find = array(' ', '&', '\r\n', '\n', '+');
$url = str_replace ($find, '-', $url);
// Eliminamos y Reemplazamos demás caracteres especiales
$find = array('/[^a-z0-9\-<>]/', '/[\-]+/', '/<[^>]*>/');
$repl = array('', '-', '');
$url = preg_replace ($find, $repl, $url);
return $url;
}
?>
2do paso: Cambiando las urls con Mod Rewrite de Apache
Para esto, se necesita tener acceso al archivo .HTACCESS en el directorio raíz de tu sitio web. Si lo tiene, escriba el siguiente código:
RewriteEngine on
Rewriterule ^articulo/(.+)/(.+) articulo.php?id =$1&title=$2
Con estas dos líneas indica que se reescriba la siguiente regla: Cuando se solicite esta url: articulo/(.+)/(.+) se mostrará el contenido de la página: articulo.php?id =$1&title=$2. Es decir, la variable $1 vendrá en el primer paréntesis, mientras la variable $2 vendrá en el segundo paréntesis.
Por ejemplo, cuando uno se dirije a la página articulo/933/esta-es-una-url-amigable, el servidor lo procesa como si se estuvieran enviando las variables la página articulo.php?id=933&title= esta-es-una-url-amigable.
3er paso: Cambiando los enlaces dinámicamente
Lo único que resta es llamar a la función urls_amigables() cada vez que mostremos un enlace. El contenido del título lo aplicamos a la función:
// La variable del título de la noticia
$url = "Este es un título";
// mostramos el titulo editado
// echo urls_amigables($url);
// mostramos la url terminada
echo “http://tu.sitio.web/articulo/”.$id.”/”.urls_amigables($url).”/”;
Realmente rápido de programar, eficiente en su performance y eficaz en el posicionamiento. He buscado en la red, algún código que me evite hacer esta labor, pero no lo encontré. Me puse a programar y resultó esta función, que me parece muy flexible a la hora de reutilizarla en cualquier proyecto.
Así pues, con el código en sus manos... utilícenlo.



Hola, que tal. Estaba leyendo el post de URL amigables y nose si mi blog las tiene o no. Si que veo que los titulos de las paginas son como tu dices, pero parecen directorios, no son paginas acabadas en php. Google indexa tambien estas paginas que estan en la base de datos y solo se ven cuando accedes a ellas mediante algun script tipo view_post.php o algo parecido?saludos!
- responder
Enviado por kitune (no verificado) el Lun, 03/06/2006 - 02:59.Hola Kitune. Asà como esta configurado tu blog, esta perfecto. Incluso muchos recomiendan que las url acabe n como directorios, he ahà porque wordpress utiliza ese tipo de urls.Si, Google también indexa las páginas dinámicas sin ningún problema. Siempre el problema con las url, fue que Google no puede leer más de dos variables ejm: articulo.php?id=23&sec=1, y yo le añado, que cuando escribes el tÃtulo de la página en la url, estas optimizando esas palabras claves. Saludos.
- responder
Enviado por Balú (no verificado) el Lun, 03/06/2006 - 23:30.Genial articulo me vendrá muy bien para alguno de mis proximos proyectos.
Gracias
- responder
Enviado por raul (no verificado) el Sáb, 04/05/2008 - 20:08.El problema que tengo yo en mi caso es que mi hosting: www.piensasolutions.com no me permite el acceso al .htaccess y por lo tanto no puedo aplicar el mod_rewrite.
Como única solución se me ocurrió hacer algo por el estilo a lo que acabo de leer ahora en este artÃculo.
Pasar a minúsculas, quitar espacios, acentos y ñ y pasar esa variable por valor.
Google no tiene muchos problemas para cojer una única variable por URL según tengo visto, aunque no dudo que el mod rewrite funcione mucho mejor, perso si no tengo otra...
Mi duda está en que si por ejemplo tengo varias noticias y según el valor que le pase por URL me carga una u otra... antes lo hacÃa pasando el ID de la noticia y buscando el id en la base de datos, pero con esto del mod rewrite y tal... se pasa el tÃtulo de la noticia, como hacéis luego para mostrar las noticias?
¿Buscais en la base de datos por el tÃtulo de la noticia y no por su id?
¿no es esto mucho más lento para la base de datos?
Saludos.
- responder
Enviado por IMAC (no verificado) el Vie, 05/09/2008 - 09:35.Saludos he implementado lo del .htaccess y he logrado esto
http://www.factormetal.com/index/action/fullnews/id/81
pero no he podido hacer que en la url me quede el titulo del articulo, estoy usando el PHPNews http://newsphp.sourceforge.net/ alguien podria por favor indicarme que debo hacer?
- responder
Enviado por Bergslay (no verificado) el Vie, 10/03/2008 - 12:14.Muy buenas, estoy intentando poner urls amigabls a este directorio web, para mejorar la indexación de sus páginas y su posicionamiento.. pero realmente no se mucho de PHP y no soy capaz de poner en práctica lo mostrado en el artÃculo. Si alguien pudiera ayudarme un poco más con este tema.. se lo agradecerÃa mucho. Os dejo mi msn por si alguno quiere contactarme: comerciales@hotmail.com . Gracias a todos, un saludo! Y felicidades por el artÃculo.
- responder
Enviado por Practica Guia (no verificado) el Mié, 11/12/2008 - 19:43.Felicidades, excelente articulo publicado, pero tengo una duda, como hacen para construir las direcciones de este tema: http://www.baluart.net/articulo/urls-amigables-con-php, no veo mas que el nombre del tema, no hay algun id?, y como obtienes la variable de la url del navegador y lo procesas para buscarlo de tu base de datos para pintar la pagina?
Gracias.
- responder
Enviado por Julian Guerrero (no verificado) el Vie, 11/14/2008 - 15:23.Pues no lo llego a entender.. me he dado contra las paredes y nada.. :( por favor si alguien me lo puede explicar mejor!! se los agradecerÃa muchisimo...
- responder
Enviado por RicardoValaRezo (no verificado) el Vie, 12/05/2008 - 00:45.Cuidado, el ejemplo tiene un espacio en la segunda linea, pone "id =" cuando deberia ser "id="
Si tomais el ejemplo literal, y lo modificais sin corregir eso, no funcionara! Dara un error 500 probablemente.
Saludos!
- responder
Enviado por Disruption (no verificado) el Sáb, 02/07/2009 - 08:37.Hola a todos, a ver si podeis despejar mi GRAN duda.
Para poder hacer esto ¿es necesario tener un campo en la base de datos que almacene la URL en minusculas y sin carataeres extraños no? Que a su vez corresponde con el campo $2 de la expresion regular..
Es que por mas vueltas que le doy.. simepre me lio.
- responder
Enviado por pepeloc (no verificado) el Jue, 02/12/2009 - 06:13.Hola que tal..necesito de una gran ayuda lo que pasa es que estoy creando unas ligas amigables pero todo funciona bien solo que las imagenes y estilos no se ven.
RewriteRule ^.*/.*/.*/.*/.*-ID([0-9]*)\.html$ mini_sitio.php?id_sucursal=$1 [L]
- responder
Enviado por JULK (no verificado) el Mié, 02/25/2009 - 13:02.Gracias por el aporte. He conseguido generar las urls para los enlaces, pero no puedo recoger las variables de la url. Me dispongo a que en función de lo que ponga en la url en el cuerpo de la página mostrar una cosa u otra pero no se como.
- responder
Enviado por Diego DH (no verificado) el Mié, 02/25/2009 - 07:01.Me ha venido genial esta informacion y por fin conseguà cambiar mis urls. Pero me queda una cosilla.
Que regla rewrite se utiliza para cambiar todas las paginas .php a la misma con el mismo nombre pero sin el .php ¿?¿?¿?
- responder
Enviado por kAn (no verificado) el Jue, 04/02/2009 - 12:49.Gracias por el magnÃfico artÃculo. Me ha servido de mucha ayuda, te tendré en mis oraciones y en la cabecera del código fuente ;).
Yo también me topé con el problema de la ruta absoluta, imágenes y css, y la solución: cambie la regla por un guión.
No he tenido mucho tiempo para leer los post, pero si alguiente sabe cómo solventar este problema sin tocar rutas absolutas le estaré agradecido.
Un saludo,
- responder
Enviado por David Moreno (no verificado) el Lun, 05/18/2009 - 07:56.Amigo haber si me puedes ayudar tengo este problema
Ejecute tu codigo y todo excelente el problema es lo siguiente:
Me convierte la url a una url amigable pero ya no me redirecciona a ningun lado un ejemplo es este
http//paginaweb.com/buscar.php?d=HolaDiseñado
ME la convierte a
http//paginaweb.com/buscar.php?d=holadisenado
el problema es que no me encuentra nada por que ya es otro url como quien dice
- responder
Enviado por Hugo Mauricio (no verificado) el Lun, 11/30/2009 - 16:07.Gracias por el tutorial. No fue fácil entender la parte de las expresiones regulares de htaccess pero apliqué lo aprendido en http://www.puromotor.cl y logré el objetivo que estaba buscando. De todas maneras les doy un consejo: tengan cuidado al simular directorios porque si la página tiene rutas relativas (por ejemplo a los archivos css o js) no encontrará los archivos. Saludos.
- responder
Enviado por vlguzman (no verificado) el Sáb, 12/19/2009 - 11:17.Excelente tutorial!
Realmente me ha servido mucho en la implementación de muchos de mis desarrollos!
Gracias!
- responder
Enviado por Hernán Benson (no verificado) el Dom, 12/20/2009 - 01:45.Hey Baluart, muchas gracias por este excelente tutorial... ya está implementado en mi blog, incluso siguiendo sugerencias de los comentarios en esta entrada... http://www.oswosmedia.com/blog/43_febrero-uno-speach-stand-by-soul
- responder
Enviado por Osvaldo Osorio (no verificado) el Mar, 02/02/2010 - 12:44.es perfecto, aunque me queda una duda, luego como lo reconviertes para el title de la página? con que función? o lo pillas de la bbdd
muchas gracias
- responder
Enviado por david alvira (no verificado) el Lun, 01/18/2010 - 16:37.Echo de todo y nada siempre me lanza
"pagina no encontrada"
estas url amigables no son nada amigables..xD
- responder
Enviado por Anonymous (no verificado) el Sáb, 02/06/2010 - 14:54.Muchas gracias me sirvio de mucho y el comentario de Sebastian que dice "...pero el problema con este tipo de soluciones, me refiero a implementar las / es que los archivos que se siguen cargando quedan mal los path, yo uso plantillas y la verdad que es mas complicado armar todo..." mi srivio para seguir utilizando url dinamicas.
Gracias nuevamente.
- responder
Enviado por Rodol (no verificado) el Jue, 01/21/2010 - 18:45.Perfecto, voy a utilizarlo a medias, ya que no puedo utilizar el mod_rewrite, probaré a ver si solo poniendo la url aunque no la tome para nada, la toma incluso por el sitemap!
Un saludo
Dkreativo.es
- responder
Enviado por Carlos Dk (no verificado) el Mar, 02/16/2010 - 09:32.Lo tengo y me funciona bien pero con Internet Explorer 6 se me cuelga en cuanto le paso mas de un parámetro.
Ej
www.misitio.com/parametro1 //funciona OK
www.misitio.com/parametro1/parametro2 //se cuenga el IE6
Alguien sabe como solucionarlo?
Me es imprescindible el segundo parametro.
Por desgracia me insisten en que "por huevos" debe de ser compatible con IE6.
Saludos
- responder
Enviado por _vic_ (no verificado) el Sáb, 02/20/2010 - 01:38.Gracias tu articulo me fue de gran ayuda
- responder
Enviado por frajagon (no verificado) el Sáb, 04/24/2010 - 16:51.Lo único que resta es llamar a la función urls_amigables() cada vez que mostremos un enlace. El contenido del tÃtulo lo aplicamos a la función:
A que te refieres exactamente con: "cada vez que mostremos un enlace"
- responder
Enviado por JuanITO1712 (no verificado) el Lun, 08/23/2010 - 20:54.El mejor articulo que visto de similares. Me ha servido de mucho, gracias
- responder
Enviado por Javine (no verificado) el Vie, 11/05/2010 - 14:29.Error PASO 1.No me reemplaza correctamente los caracteres acentuados, directamente no salen. Debo de utilizar utf8_decoder()
Gracias.
- responder
Enviado por xemix (no verificado) el Sáb, 02/05/2011 - 11:36.No explicas la parte de implementacion, vaya, yo ya implemente el codigo para pasar de URL a url_amigable(), tambien establece algunas reglas en el .htaccess, el problema es que la pagina se muestra SIN LOS ESTILOS e IMAGENES DE FONDO.
Ya agregue la URL directa completa a los estilos CSS e imagenes, pero aun asi persiste el problema !
Que puedo hacer ?
- responder
Enviado por Anonymous (no verificado) el Lun, 01/31/2011 - 13:48.Gracias por la info, estoy intentando implementarlo en un wordpress modificado, pero mno lo lorgo seguiré intentandolo, muchas gracias y enhorabuena por el blog,es muy completo y con muchos tips muy útiles. Saludos!
- responder
Enviado por Jorgejobs (no verificado) el Dom, 02/13/2011 - 17:00.Muchas gracias por el tutorial, después de un mes veo mejorar mucho los resultados de búsqueda.
El cambio fue un éxito.
- responder
Enviado por Foro mascotas (no verificado) el Mar, 03/01/2011 - 11:39.Deja tu comentario