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 cannabico

"Pasamos de tener unas 5,000 páginas indexadas a más de 12,000"Te estás pasando un detalle por alto... Al modificar las urls, google ha vuelto a indexar tus contenidos con otra dirección, por eso que casi se duplicó el número de páginas indexadas, porque ha indexado páginas que ya tenía en su índice pero ahora con otra dirección.Si no le avisamos a google con un header 301 o 302 (no recuerdo cual es el temporal y cual el permanente), él no se entera de que en realidad lo único que hicimos fue cambiar las direcciones y las toma como contenido nuevo.Esto puede tener resultados adversos si google cree que lo estamos intentando engañar con contenido duplicado, por eso luego de hacerlo también es buena idea anular las urls anteriores en el robots.txt en el caso de que sea posible. Saludos 

Imagen de Carmen
Carmen

Y suponiendo que mis urls son así:/index.php?action=fullnews&showcomments=1&id=78Intente hacerlo de la manera que explicastes en tu artículo, pero al parecer usamos diferentes tipos de urls.Si me podrías ayudar, te lo agradecería.

Imagen de baluart

Hola Carmen, efectivamente usamos distintos sistemas de urls. Lo primero y esencial que debes hacer es limpiar las urls. Del artículo, modifica el .htaccessRewriterule ^noticias/(.+)/([0-9]+)/([0-9]+) index.php?action =$1&id=$2&showcomments=$3Y cambia los enlaces a:noticias/fullnews/78/1De esta manera tienes tus urls limpias y serán mejor indexadas en los buscadores. También hay otros métodos que puedes investigar, pero este es el más sencillo.Ahora bien, para que sean realmente amigables, necesitas añadir algún texto significativo a la página, ese texto (lo puedes extraer del título de la noticia) lo parseas con la función php del post y lo añades como variable  en el .htaccess y en los enlaces.Espero te sea de ayuda, disculpa la demora, pero por falta de tiempo me es imposible absolver todas las dudas.Un saludo.

Imagen de Harry271
Harry271

+1 Its very interesting

Imagen de vITT

Muchisimas gracias por este articulo me fue de gran utilidad!!!Saludos!!! 

Imagen de omar
omar

Hola, muy bien tu artículo, a execepción de ...Dónde pongo el código php? para que me sirve hacer un echo con  la liga amigable? no entiendo donde va eso o para que  lo haces ... Dónde pongo ese código php y para que?Atte OMar. Buen artículo* 

Imagen de baluart

Omar, la funcion php va en un archivo aparte, luego la incluyes con un require_once en los archivos que desees usarla. Para mostrar los enlaces debes poner el c

Imagen de omar
omar

Hola, muy bien tu artículo, a execepción de ...Dónde pongo el código php? para que me sirve hacer un echo con  la liga amigable? no entiendo donde va eso o para que  lo haces ... Dónde pongo ese código php y para que?Atte OMar. Buen artículo* 

Imagen de omar
omar

Gracias por la respuesta, pero pasa algo ...tenogo 2 archivos .php uno es el index.php al que llama inmediantamente con una liga como esta : www.mipage.compero tengo otro que recibe el nombre de un usuario y lo procesa, ya conseguí con el .htaccess que reconociera las url amigables, pero cuando llamo a esa url de esta forma:www.mipage.com/datos/omarpara sacar los datos de omar en un html. No lo hace bien, pareceiese que no incuye los js ni los css, y pues no puedo hacer nada. Alguna sugerencia?Es por el tipo de archivo? tengo que modifcar algo en el apache? Gracias 

Imagen de omar
omar

PAra el comentario anterior, se me olvidó poner la parte de código del .htaccessOptions +FollowSymLinksRewriteEngine onRewriteRule ^album/(.*)$ album.php?usuario=$1que es esacuando pongo una url como esta en al barra de direcciones del navegador si lo hace bienwww.mipagina.com/album.php?usuario=omarpero cuando uso la url amigable si me manda a album.php pero no lo procesa bien, porque no incluye el js ni el css, pero si ejcuta el código php www.mipagina.com/album/omarGracias 

Imagen de bAxTEr

Gran aporte y de mucha utilidad Bye!

Imagen de gerardo
gerardo

Hola balu una pregunta como seria el .htaccess para usar las url cuando estas paginadoasi http://www.baluart.net/pagina2gracias espero tus comentariossaludos

Imagen de cesar
cesar

Saludos a todos.Omar yo tuve el msimo problema y es por el / que utilizamos para separar las variables, es que al parecer al generar el codigo html lo considera como si estuvieras en una carpeta mas adentro, es por eso que todos los links se malogran, yo lo resolvi utilizando _ para la separacion, eso si hay que tener cuidado con el redireccionamiento ciclico, creo que solo es cuestion de utilizar nombres largos y algo complejos para diferenciar bien la url amigable de la verdadera.Espero te sea de utilidad.

Imagen de cesar
cesar

Saludos a todos.Omar yo tuve el msimo problema y es por el / que utilizamos para separar las variables, es que al parecer al generar el codigo html lo considera como si estuvieras en una carpeta mas adentro, es por eso que todos los links se malogran, yo lo resolvi utilizando _ para la separacion, eso si hay que tener cuidado con el redireccionamiento ciclico, creo que solo es cuestion de utilizar nombres largos y algo complejos para diferenciar bien la url amigable de la verdadera.Espero te sea de utilidad.

Imagen de cesar
cesar

Saludos de nuevo, pero ahora va mi pregunta, que pasa si quiero poner mas de una validacion en el htaccess algo como esto:RewriteEngine onRewriteRule ^europacategoria_(.+).htm europa_opc3serie.php?serie=$1RewriteRule ^europaproducto_(.+).htm europa_opc_folleto.php?codigo=$1RewriteRule ^europaproducto_(.+)_(.+).htm europa_opc_folleto.php?europa=$1&codigo=$2Los dos ultimos es porque europa_opc_folleto.php a veces le paso 2 variables y a veces solo una variable, esta bien asi.? o hay alguna forma de condicionar...?gracias por su tiempo.

Imagen de Juanjo
Juanjo

A mi me ocurre igual que a Omar, usando:RewriteRule ^archives/([0-9]+)$ archives?p=$1No me funciona. Pero si lo cambiao a:RewriteRule ^petete/([0-9]+)$ archives?p=$1 Me funciona pero no me carga las css ni imagenes, debe ser por lo que dice Cesar. He probado su solcui

Imagen de Alejandro
Alejandro

Hola el articulo esta muy bien de hecho lo utilice como fuente para un tutorial que hice pero ahora tengo un problema que creo que alguien mas ha tenido aqui pero no veo la respuesta.El tema esta que tengo algo muy simple en el .htaccess Options +FollowSymLinksRewriteEngine onRewriteRule ^(.+)/$ debug.php?servicioID=$1Si lo ejecuto en http://localhost/Aca-Lo-Que-Sea/  anda perfecto pero si eso mismo lo tengo en un alias tipohttp://localhost/sitiox/Aca-Lo-Que-Sea/  deja de funcionar dando el error Not Found The requested URL /apache/Aca-No-Anda/ was not found on this server.Que alguno me ilumine :) 

Imagen de charly
charly

Recién comienzo con todo esto. A pesar de esta excelente info y otras que hay en la red no logro hacer marchar algo tan simple como esto: pagina.php?link=auto Ej: RewriteRule ^([^/]*)\.html$ pagina.php?link=$1 [L] He usado los convertidores online le he dado mil vueltas y nada. El programa en cuestión esta en “zend” 1-no puedo modificarlo) 2-influye que este en zend?… agradezco alguna pista para seguir investigando. Gracias

Imagen de sonic22
sonic22

Hola, probando y probando sin conseguir resultado alguno, mi consulta es la siguiente: necesito tener la url asi: http://www.dominio.com/algo donde algo seria "ver.php?id=nn", claro hasta ahi todo bien, pero el id es numerico yo lo que necesito es pasar tambien el titulo, existe alguna expresion para que utilice el ID, y muestre solamente el titulo por asi llamarlo???

Imagen de Diego

hola gracias por este aportazo voy a implementarlo en esya pagina web y vamos a ver los resultados  gracias de antemano 

Imagen de Edilberto
Edilberto

uaaaaaaaaaa viejooo ... meses buscando este pedazo de información y casi que no la encuentro jajaja!! GRACIAAS!!!

Imagen de sulivan
Imagen de Martin

Hola, solo comentarte que deber

Imagen de Freddy
Freddy

Hola, siguiendo el tutorial ya me salio las urls amigables, este es mi codigo:<?$id=15;// La variable del t

Imagen de danraf77
danraf77

saben si yahoo deja subir el .htaccess? yo intento y no me deja o q tengo q modificar para q me deje subir dicho archivo, y si no se puede de q manera puedo hacer URLs amigables sin usar .htaccess

Imagen de danraf77
danraf77

saben si yahoo deja subir el .htaccess? yo intento y no me deja o q tengo q modificar para q me deje subir dicho archivo, y si no se puede de q manera puedo hacer URLs amigables sin usar .htaccess

Imagen de danraf77
danraf77

saben si yahoo deja subir el .htaccess? yo intento y no me deja o q tengo q modificar para q me deje subir dicho archivo, y si no se puede de q manera puedo hacer URLs amigables sin usar .htaccess

Imagen de Freddy
Freddy

Hola, siguiendo el tutorial ya me salio las urls amigables, este es mi codigo:<?$id=15;// La variable del t

Imagen de sealbcn
sealbcn

Freddy ,El traspaso de las variables se realiza exactamente igual, lo

Imagen de lanzarote

Hay que recordar tener el modrewrite en on en la configuración del apache.

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