Urls Amigables con PHP

baluart14 Febrero 2006 - 11:28pm 113 comentarios
Enviar por Email Imprimir

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.

Comentarios

Imagen de Balú

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.

Imagen de Luis
Luis

    Primero que todo muy buen articulo, es muy bueno pero tengo un proglema y es que al tranformar la url (http://localhost/pagina/1/este-es-un-titulo/) me arroga un error apache:Not Found The requested URL /dreanwolf/1/este-es-un-titulo/ was not found on this server. Apache/1.3.34 Server at localhost Port 80 Modifique asi mi archivo php:$op=1;$url_a ='http://localhost/dreanwolf/'.$op.'/'.url_amigables($url).'/';echo '<a href='.$url_a.'>Cosa</a>';Tambien modifique el .htaccess en ves de id puse op y cambie tambien el articulo.php por index.php, tengos windows pero la funcion Rewrite esta activida, es mas la probe con joomla y cero problema. Gracias.

Imagen de piojo
Imagen de Balu

HOla Enmanuel, acabo de entrar a tu web, a empresa por actividad y funciona correctamente. Supongo que ya lo solucionaste. Un saludo.

Imagen de Enmanuel
Enmanuel

Hola Balu, tengo una duda que creo tu puedes responderme, estoy actualmente desarrallondo un directorio y como todos estoy haciendola con urls amigables, mi problema esta en que con algunos enlaces se confunde el mod_rewrite al momento de ejecutarlos, cual podria ser la causa ya que en otros si funciona bien.La url del directorio es esta www.encontrado.es, y la parte donde se confunde el mod a la hora de resolver es en "Empresa por actividad".Ahi podras revisar al hacer clik en las diferentes categorias que en algunas se confunde.Bueno espero puedas ayudarme con este problema que no logro obtener la rpta al porque de eso. Gracias

Imagen de Balu

Que bien que te sea útil, Pedro. Un saludo.

Imagen de pedro
pedro

Ya lo probe en un blog que estoy armando y funciona muy bien. Es de mucha ayuda articulos como este. Saludos. 

Imagen de Balu

Hola Oxioso, el .htacces va sobre linux. Si tu server esta sobre windows sigue los pasos del comentario #10.Saludos. 

Imagen de oxioso
oxioso

hola alguien me podria ayudar en como aplicar este script, soy principiante entiendo varias cosas y ya las intente pero no funciona, ni siquiera encuentro el htacces en mi web, la busque mediante ftp y no la tiene, la intente crear y no me sube el archivo, es sobre windows y es un proveedor de hosting no monte yo el server, espero que alguien me pueda orientar

Imagen de Rodrigo

RewriteEngine on Rewriterule ^articulo/(.+)/(.+) articulo.php?id =$1&title=$2 cuando ingreso la segunda linea e da error, como hago para saber si tengo permisos y eso??   saludos  PD: muy buen articulo 

Imagen de juanse

hola. tengo un problema con el mode rewrite.en mi web tengo esto.RewriteEngine onRewriterule ^(.*)-(.*).html$ index.php?ide=$2la url me queda asi  nombre_programa-23.htmlhasta ahi eso solo va perfecto.pero aparte tengo esta otra url para mostrar perfiles de usuarios.index.php?per=nombreusuariocomo ven utilizo la misma pagina index.php pero diferentes variables para los programas y para los perfiles.quiero una url asi para los perfiles. nombre_usuario.htmlcomo tendria que adaptar el mode rewrite para utilizarlo con los perfiles y no me afecte el de los programasgracias y saludos.

Imagen de Javier Seixas

Felicidades por el artículo. He intentado poner en práctica lo expuesto pero no he podido porque mi servidor compartido, en Arsys, no dispone de la posibilidad de modificar el .htacceess. Si lo haces deja de funcionar la web. Desgraciadamente tampoco podemos cambiar de servidor para el cliente.Esta circumstancia me hace preguntaros si alguno conocer alguna forma de hacer URLs amigables sin necesidad de utilizar componentes del servidor.Gracias por vuestra ayuda.

Imagen de j0s

bueno... pero no me sale... me e leido un monton de manuales de url amigables :S y naaa... estoy probando esto en mi pc.. osea con localhost... porque estoy programando un foro.... alguien k me ayude... plzzzz

Imagen de baluart

así es J0s. Cómo lo haz hecho esta muy bien, sólo separalos:Rewriterule ^viewforum/(.+) viewforum.php?id=$1Ahora que si lo necesita para los foros, es mejor que busques información sobre ello y no lo hagas a mano. Suelen haber scripts ya creados por la red.Saludos.

Imagen de j0s

bueno... ya pude hacer los enlaces... y esto me lleva asi http://localhost/foro/viewforum/1  era asi viewforum.php?id=1 hasta ahi todo.. bien .. pero no se si esta bien mi .htacces asi lo cambie.RewriteEngine on  Rewriterule ^viewforum/(.+)viewforum.php?id=$1plzzz ayudenme

Imagen de j0s

bueno manes..en verdad por mas k probe no me salio ... tmr ... toy ttriston .. ojala y alguien me pueda explicar la ultima parte el de cambiar los enlaces dinamicamente... o k me agregue al msn pues... gracias

Imagen de Mario
Imagen de John

Gracias Balu, todo funciono de maravilla!John

Imagen de Balu

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.

Imagen de john

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"];?>

Imagen de jesusvld

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.

Imagen de Ernesto

@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

Imagen de jesusvld

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.

Imagen de Balu

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. 

Imagen de jesusvld

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

Imagen de Antonio
Imagen de Balú

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.

Imagen de sebastian

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

Imagen de Kitune
Imagen de kitune

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!

Páginas

Tutoriales

Cómo descargar videos de VK.com
En este artículo voy a explicar como descargar videos y películas...
Descargar Facebook Móvil Gratis
Por si aún no lo han hecho, es posible descargar Facebook Móvil...
Cómo generar tráfico web con las redes sociales - Paso a Paso
Muchas empresas están publicando contenidos como la forma de crear...

Artículo Recomendado

3 Tips cruciales para recuperar archivos eliminados
¿Te imaginas perder el trabajo de toda una semana en tan solo unos segundos? Todos hemos pasado por este problema. Quizás eliminamos por error un archivo importante o lo borramos sin pensar que era valioso para otro... más