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 Noticias Tecnologicas
Imagen de suelo industrial
Imagen de Edgar Sarabia!
Edgar Sarabia!

Hola, de favor puedes despejarme la siguiente duda.
Tengo una pagina donde muestro todos mis articulos llamada articulos.php
Tengo otra para mostrar la información del articulo seleccionado llamada informacion.php

Solo quiero pasa una variable que es el ID del articulo por lo tanto quiero que se muestre algo asi:

http://mipagina/informacion/34/
¿Que paso tengo que colocar en cada archivo, y como pongo la URL en el href de mi pagina articulos?
Esperando contar con tu apoyo, recibe un coordial saludo!

Imagen de baluart
baluart

En el htaccess

RewriteEngine on

Rewriterule ^informacion/(.+) informacion.php?id =$1

En información.php recuperas la ID del artículo con:

$id_articulo = $_GET["id"]

Los enlaces debe ser http://mipagina/informacion/34/

Saludos,

Imagen de alain camacho
alain camacho

tienes toda la razón!! -_- ese es un pendex, lo hizo a proposito para hacernozla mas dificil... pero ya lo solucione gracias a tu comentario D:

Imagen de Osvaldo Osorio
Imagen de Anonymous
Anonymous

Echo de todo y nada siempre me lanza
"pagina no encontrada"
estas url amigables no son nada amigables..xD

Imagen de Carlos Dk

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

Imagen de _vic_
_vic_

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

Imagen de frajagon
frajagon

Gracias tu articulo me fue de gran ayuda

Imagen de JuanITO1712
JuanITO1712

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"

Imagen de Javine

El mejor articulo que visto de similares. Me ha servido de mucho, gracias

Imagen de Anonymous

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 ?

Imagen de xemix
xemix

Error PASO 1.No me reemplaza correctamente los caracteres acentuados, directamente no salen. Debo de utilizar utf8_decoder()

Gracias.

Imagen de coudlain.com
coudlain.com

espectacular articulo, me ha servido de mucho. Por favor sigue asi, gracias!!

un saludo

Imagen de fernando19
Imagen de RaúlG
RaúlG

Estimado.
Muy buena opción, casualmente estaba por crear una clase para generar las url a partir de títulos de artículos y tu función me sirvió.
Solamente le hice la siguiente modificación, ya que tenía problemas de codificación a la hora de pasar el string a minúsculas con strtolower(), por lo que lo reemplace con mb_strtolower() que sí permite especificar la codificación de los caracteres y evitar errores.

Si a alguien le sirve:

Esta línea yo la tuve que reemplazar:

$url = strtolower($url);
$url = mb_strtolower($url, 'UTF-8');

Ahora funciona perfecto!

Gracias!

Imagen de baluart
baluart

Gracias por el añadido Raúl! Un saludo.

Imagen de VainoP

Saludos. Soy nuevo en PHP y MySQL. Recibí este sitio ya hecho, y no he podido corregir la generación de URLs. Cuando se generan elimina los acentos y la ñ pero sin poner nada en su lugar (solución=solucin, España=espaa, etc).
Ejemplo: http://cecglob.com/298/contenido/egipto+nuestra+nacin+est+incendindose Y el título de la página es "egipto nuestra nacin est incendindose"
Rewriterule ^([a-zA-Z0-9-]*)\/([a-zA-Z0-9-]*)\/([a-zA-Z0-9-+]*)$ index.php?id=$1&title=$2&otro=$3

¿Alguna idea?

Imagen de Susotrek
Susotrek

Buenas.

Tengo un problema con las URL amigables. No tengo ningún problema al traducir www_prueba_com/noticias/22/prueba a www_prueba_com/noticias.php?id_noticia=22. La cuestión es que ahora las rutas originales de scripts o imágenes han pasado de ./imagen.jpg a ./noticias/22/imagen.jpg con el problema de que no las encuentra.

Muchas gracias de antemano.

Imagen de Alina

Muchas gracias por la información.
He estado viendo muchos tutorials, articulos, videos.... y ninguno como este!!!!!!!!!

Imagen de Hugo López

Hola:
Dónde pongo lo que empieza con
<?php
function urls_amigables($url) {

// Tranformamos todo a minusculas

$url = strtolower($url);

en el htacces ?
en alguna página?
por favor,si podés explicarme dónde pongo cada cosa, disculpá mi pobre conocimiento.
Espero tu sabio comentario,Saludos.-

Imagen de manuschroeder
manuschroeder

Buenas Balú. Tu tutorial me ha resultado muy útil, sin embargo me surge una duda que ya he visto en otros comentarios. Mi pregunta es referente al uso de la función urls_amigables($url). ¿Deberíamos colocarla, por ejemplo, al inicio de nuestras páginas y redireccionar con header( “http://tu.sitio.web/articulo/”.$id.”/”.urls_amigables($url).”/”)? ¿O en donde? Sé que se trata de una pregunta muy básica, pero todo viene perfectamente explicado hasta el paso 3 y allí hago agua. Gracias desde ya. Saludos desde Argentina.

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