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

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!

Enviado por kitune (no verificado) el Lun, 03/06/2006 - 02:59.
Hola Kitune. Así com

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.

Enviado por Balú (no verificado) el Lun, 03/06/2006 - 23:30.
Genial articulo me vendrá muy

Genial articulo me vendrá muy bien para alguno de mis proximos proyectos.

Gracias

Enviado por raul (no verificado) el Sáb, 04/05/2008 - 20:08.
El problema que tengo yo en

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.

Enviado por IMAC (no verificado) el Vie, 05/09/2008 - 09:35.
Saludos he implementado lo

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?

Enviado por Bergslay (no verificado) el Vie, 10/03/2008 - 12:14.
Muy buenas, estoy intentando

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.

Enviado por Practica Guia (no verificado) el Mié, 11/12/2008 - 19:43.
Felicidades, excelente

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.

Enviado por Julian Guerrero (no verificado) el Vie, 11/14/2008 - 15:23.
Pues no lo llego a entender..

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

Enviado por RicardoValaRezo (no verificado) el Vie, 12/05/2008 - 00:45.
Cuidado, el ejemplo tiene un

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!

Enviado por Disruption (no verificado) el Sáb, 02/07/2009 - 08:37.
Hola a todos, a ver si podeis

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.

Enviado por pepeloc (no verificado) el Jue, 02/12/2009 - 06:13.
Hola que tal..necesito de una

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]

Enviado por JULK (no verificado) el Mié, 02/25/2009 - 13:02.
Gracias por el aporte. He

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.

Enviado por Diego DH (no verificado) el Mié, 02/25/2009 - 07:01.
Me ha venido genial esta

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 ¿?¿?¿?

Enviado por kAn (no verificado) el Jue, 04/02/2009 - 12:49.
Gracias por el magnífico

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,

Enviado por David Moreno (no verificado) el Lun, 05/18/2009 - 07:56.
A tu htaccess añadele otro

A tu htaccess añadele otro parametro para el texto. Aunque si utilizas un CMS, lo mejor es buscar un plugin o modulo que se encargue de eso, a fin de evitar el tocar código de su core.

Saludos.

Enviado por baluart el Sáb, 10/04/2008 - 02:27.
Si claro tenes que buscar

Si claro tenes que buscar despues por el titulo ya que no tenes forma de saber su id.
Otro truquito que implementan algunos y si lo queres optimizar es hacer lo siguiente en las url le pones el titulo y concatenale al ultimo el id: Ej www.tbusca.com.ar/manuales-de-php-5344. Entonces luego recuperas el valor del id y lo mandas a buscar a la base de datos. Saludos

Enviado por Fernando muñoz (no verificado) el Mié, 01/21/2009 - 09:09.
Si vas a almacenar la url en

Si vas a almacenar la url en la base de datos, ya no es necesario que en la url este la id. En este caso, sólo necesitas la id, el resto es accesorio.

Prueba con

http://www.baluart.net/articulo/urls-amigables-con-php#comment-233

Enviado por baluart el Jue, 02/12/2009 - 21:53.
Ahh, ok. :) Gracias.

Ahh, ok. :) Gracias.

Enviado por Kitune (no verificado) el Mar, 03/07/2006 - 00:47.
pero el problema con

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 relativamente, además no lo veo como solucion pues implementar una solución así para el hecho de que ahora mis url queden friendly no me gusta. Que tal si en vez de x ej este articulo http://www.baluart.net/articulo/403/urls-amigables-con-php.php seria http://www.baluart.net/articulo/403_urls-amigables-con-php.php y dividís a partir del _?

Enviado por sebastian (no verificado) el Mar, 03/14/2006 - 21:47.
Desde luego, por ell

Desde luego, por ello cuando se cambian las urls añadiendo directorios ("/") debemos cambiar las referencias a los archivos externos (css, js, imagenes, peliculas, etc.) de manera absoluta por ejm. http://tu.sitio.web/img/image01.jpg (no img/image01.jpg).Por otro lado, lo que mencionas de hacerlo con un guión es una buena alternativa.Para seguir con el artículo, lo que debemos modificar: En el mod rewrite, la regla quedaría: Rewriterule ^articulo/(.+)_(.+) articulo.php?id =$1&title=$2Luego, en nuestros archivos, simplemente cambiamos:// mostramos la url terminada echo “http://tu.sitio.web/articulo/”.$id.”_”.urls_amigables($url).”.php”;Y de esta manera podemos modificar nuestras urls, como mejor nos parezcan.

Enviado por Balú (no verificado) el Mar, 03/14/2006 - 22:40.
Una excelente herram

Una excelente herramienta para crear las reglas del modrewrite esmod_rewrite RewriteRule GeneratorEspero les sirva. Saludos.

Enviado por Antonio (no verificado) el Mié, 03/15/2006 - 07:11.
Hola Balú, muy inter

Hola Balú, muy interesante tu articulo. Mi pregunta era ¿cómo configurar urls amigables pero en el cpanel?

Enviado por jesusvld (no verificado) el Lun, 06/19/2006 - 20:50.
Hola Jesusvld, una h

Hola Jesusvld, una herramienta especial para configurar urls amigables en cpanel creo que no existe (o por lo menos no la conosco). De todos modos, lo que se suelo hacer es por ejemplo ir a file manager > public html > .htaccess y luego pulsas edit file en la esquina superior izquierda, se te abre un popup para que escribas el código necesario. Igual sería con los ficheros php necesarios.No sé que tan útil te pueda ser lo dicho, pero espero te sirva. Saludos. 

Enviado por Balú (no verificado) el Mar, 06/20/2006 - 10:14.
Yo probe de manera l

Yo probe de manera local con tu tutorial pero no salia, a pesar de haber modificado el archivo .htaccess. No se cual fue mi error, he leido y releido tu articulo pero nada. Mi objetivo era primero hacer pruebas de manera local y luego, si sale bien, hacer los cambios en el cpanel como tu indicastes. Espero una ayudadita.

Enviado por jesusvld (no verificado) el Jue, 06/22/2006 - 14:33.
@Jesusvld:Lo más seg

@Jesusvld:Lo más seguro es que las pruebas las estés haciendo en un servidor windows, que no tiene 'mod rewrite' activado por default, que es el módulo que apache utiliza para reescribir las url's.tienes que abrir el archivo de configuración del apache, httpd.conf, descomentar las líneas (quitando el #):#LoadModule rewrite_module modules/mod_rewrite.so#AddModule mod_rewrite.cy modificar la línea:AllowOverride Nonepor:AllowOverride Ally reiniciar el servicio de apache. Con eso funciona perfectamente en windows.... si no se me escapa algo ;-).Saludos desde México

Enviado por Ernesto (no verificado) el Mar, 07/04/2006 - 11:52.
Gracias por el dato

Gracias por el dato Ernesto, lo probaré en el servidor local, sin embargo en mi servidor web ya configure los urls a urls amigables y quedo muy bien.

Enviado por jesusvld (no verificado) el Vie, 07/07/2006 - 08:25.
HolaTe molesto porqu

HolaTe molesto porque leo, pero no puedo hacer funcionar esta funcion.-En la url que envie, aparece un anuncio. La idea es que este anuncio lleve el link del nombre del articulo. Solo pude lograr que se llame articulo3.html, pero no me es posible que tome el nombre del linkCopio parte del script a ver si es de utilidadMil gracias por tu ayuda!John - Argentina                <?php    }                ?>                <td > <font class="normal"> <a href="articulo<? echo $rs0["id"]?>.html" class="small_link" title="View Classified Description">          <?    if($rs0["bold"]=='yes')     {echo "<strong>";}    ?>                  <? echo $rs0["product_name"];?>

Enviado por john (no verificado) el Jue, 08/17/2006 - 21:04.
Hola John, si sigues

Hola John, si sigues lo descrito en el artículo, la url a conseguir es articulo3-nombre-del-producto.htmlPara ello sigue lo siguiente:<?php // almacenas el nombre del producto en la variable$url = $rs0["product_name"];?><a href="<? echo "articulo".$rs0["id"]."-" .urls_amigables($url).".html"; ?>Asegurate de tener el título del articulo como valor de la variable $url, según el código que haz puesto, parece estar almacenada en la variable $rs0["product_name"]. Y asegurate de hacer el include a la función.En el .htaccessRewriterule ^articulo([0-9]+)-(.+).html producto.php?id =$1Con esta regla, solo interpretas la variable id del articulo y el texto del título pasa sin interferir con la id. Esto es todo, espero te funcione sin problemas.

Enviado por Balú (no verificado) el Vie, 08/18/2006 - 18:58.
Gracias Balu, todo f

Gracias Balu, todo funciono de maravilla!John

Enviado por John (no verificado) el Mar, 08/22/2006 - 06:32.
Espero que les sirva

Espero que les sirva esto:http://www.phpclasses.org/browse/package/1844.htmlademas  el sitio es muy util si lo que les gusta es trabajar con objetos.Saludos

Enviado por Mario (no verificado) el Lun, 08/28/2006 - 08:54.

Deja tu comentario

El contenido de este campo se mantiene privado y no se mostrará públicamente.
  • Las direcciones de las páginas web y las de correo se convierten en enlaces automáticamente.
  • Etiquetas HTML permitidas: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Saltos automáticos de líneas y de párrafos.

Más información sobre opciones de formato