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 raul

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

Gracias

Imagen de IMAC
IMAC

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.

Imagen de Bergslay
Imagen de baluart

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.

Imagen de Practica Guia

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.

Imagen de Julian Guerrero
Julian Guerrero

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.

Imagen de RicardoValaRezo
RicardoValaRezo

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

Imagen de Fernando muñoz

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

Imagen de Disruption
Disruption

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!

Imagen de pepeloc
pepeloc

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.

Imagen de baluart
Imagen de Diego DH
Diego DH

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.

Imagen de JULK
JULK

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]

Imagen de kAn

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

Imagen de David Moreno

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,

Imagen de Hugo Mauricio
Hugo Mauricio

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

Imagen de vlguzman

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.

Imagen de Hernán Benson

Excelente tutorial!
Realmente me ha servido mucho en la implementación de muchos de mis desarrollos!
Gracias!

Imagen de Dev
Dev

Compañero, encontré una solución que me funciona a la perfección:

Con esa etiqueta despues de podrás seguir usando rutas relativas para la construcción de tu web, y este grandioso script para generar urls amigables.

Saludos.

Imagen de david alvira
david alvira

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

Imagen de Rodol

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.

Imagen de Jorgejobs

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!

Imagen de Foro mascotas

Muchas gracias por el tutorial, después de un mes veo mejorar mucho los resultados de búsqueda.
El cambio fue un éxito.

Imagen de TonchitoZ

Alguien por ahí comentó que tenía un problemita con los ESTILOS CSS que no se visualizaban correctamente. Lo mismo me sucedió a mi, pero lo solucioné aplicando este formato al llamar al archivo css.

Como notarás especifiqué que tome simplemente el archivo style.css del directorio raíz (../) ;)

Espero le sea de utilidad a más de uno y muchas gracias por el tutorial :)

Imagen de Jonas78li
Jonas78li

Para ejecutar un .htaccess sólo tienes que crear el archivo en block de notas y lo guardas tal cual, sin extensión. Luego lo subes a la carpeta principal de tu web o subdominio, asi de sencillo, no es que tu servidor tengan algún comando o link para acceder al .htaccess y editarlo. Ahora, es probable que al guardar tu script en el block de notas con el nombre .htaccess éste no te lo permita, simplemente gurádalo como cualquier txt y por fuera lo renombras. Suerte.

Imagen de matesasesinos
matesasesinos

la verdad, muy buena solucion, me gustaria volarle el id pero ya me di cuenta que cuando cometes el error de hacer las consultas en base a id (como yo ja) no se puede.

No se si respondieron por ahi como se soluciona lo de los CSS y archivos incluidos (js por ejemplo) con el rewrite es simple,

se hace un archivo que se llame por ejemplo base.php

adentro de ese archivo se escribe esto y se lo ponen a las paginas php con un require_once('base.php') (o include lo mismo)
con esto se logra hacer una ruta absoluta por lo cual el rewrite encuentra los archivos, la otra forma es agregar al mismo htacces la siguiente linea
RewriteBase /
asi como esta ahi, pero depende de como este configurado el servidor, a veces no sirve para leer los arhivos.
Con esto se soluciona lo de los estilos perdidos, admeas por si no se dieron cuenta, tambien perdieron todos los js je... espeor les sirva y no llegue 10 años atrazado a contestar esto.
Muchisimas gracias por esto, fue muy buena solucion y facil para algo que a veces nos complica la vida al pedo...

Imagen de alexandro
alexandro

mmm.. sigo sin entender las url amigables... me resultaria mas facil con una desmostracion

Imagen de Matias22
Matias22

Hola, muy bueno el tutorial, pero tengo una duda, ya que en mi web hay varios archvios que deberia combertir en URLs amigables. Por ejemplo tengo el info.php, el listado.php y otros tantos.
Ahora en ese caso como se hace cuando hay que hacer más de un cambio? Ahora tengo así:
Rewriteengine on

Rewriterule ^(.+)-(.+) info.php?id=$1titulo=$2

Luego intenté de agregar otro rewriterule, pero solo me tiene en cuenta el que está primero.

Rewriteengine on

Rewriterule ^(.+)-(.+) info.php?id=$1titulo=$2
Rewriterule ^Listado-pagina(.+) search2.php?page=$1

Por último, tengo una sección que son provincias y son 23, buenosaires.php, sanjuan.php...etc, en ese caso que se podria hacer? porque cada provincia tiene su listado y me quedaria buenosaires.php?page=2.....

Muchas Gracias!!!

Imagen de David Rodriguez
David Rodriguez

Hola! esto es justo lo que necesito, con extremada urgencia, pero he implementado el script y o me funciona, quizas estoy equivocado en la manera de implementarlo, alguien me podria ayudar por favor?...

Imagen de Angel Luis Ponce

Normalmente las variables es recomendable utilizarlas tal cual se están pasando por el método GET, que quiero decir con esto. Que en tu tabla debes tener un campo con ese nombre para que solo busques ese valor y no tengas que realizar alguna conversión innecesaria con php.

Espero te sea útil mi respuesta

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