Optimizando las URLs para la búsqueda

Publicado en PHP Avanzado por Nok el Julio 15th, 2003

Conociendo el mod_rewrite de Apache 1.3.x

El primer método que veremos será utilizando el este es usando el Motor de Re-escritura de URLs de Apache (mod_rewrite), que es uno de los métodos más sencillos de aplicar. Antes de utilizar esta poderosa herramienta, primero conoceremos algunos de sus parámetros de configuración para sacarle más provecho.
Por lo general este modulo viene cargado en Apache, pero sino, lo pueden activar desde el httpd.conf de sus apaches descomentando la línea:

LoadModule rewrite_module modules/mod_rewrite.so

Una vez que tenemos instalado este modulo, veamos algunas de las directivas de configuración con las que cuenta:

RewriteEngineon | off
Con esta directiva lo que hacemos es activar o desactivar el motor de re-escritura. Sus únicas posibilidades son on (activo) u off (desactivo)

Expresiones regulares
El mod_rewrite soporta expresiones regulares las cuales responde a la siguiente especificación:

Texto:

.
Cualquier carácter
[caracteres]
Clase de caracteres: Algún carácter dentro de caracteres
[^caracteres]
Clase de caracteres: Ningún carácter dentro de caracteres
texto1|texto2
Alternativa: texto1 or texto2

Cuantificadores:

?
0 o 1 ocurrencia del texto precedente
*
0 o más ocurrencias del texto precedente.
+
1 o más ocurrencias de el texto precedente.

Grupos:

(texto)
Grupo de texto. Sirve para agrupar texto o para utilizarlo como referencia luego.

Inicio y Fin:

^
Principio de línea.
$
Fin de línea.

Caracteres de escape (no ser considerados especiales):

\car
Escapa el carácter car. Por ejemplo, “\.” se considera el punto en sí, no cualquier carácter. De mismo modo \n representa el salto de línea, etc.

Además, existen las referencias a expresiones entre paréntesis previas (back-references), y las referencias a variables de entorno. Para las primeras se utiliza $N, donde N es el numero (en orden) de la expresión entre paréntesis en la expresión regular previa, es decir,
si tenemos: Hola (.*). Que tal $1.
$1 hace referencia a la expresión matcheada en el primer grupo de paréntesis.
En cuanto a las segundas (variables de entorno) se las referencia usando %{NOMBRE_VAR}. Por ejemplo: %{REQUEST_URI}

RewriteCond CadenaEvaluada Patrón
Con esta directiva podemos realizar reglas condicionales, es decir, chequear de antemano cual es la URI para saber si se le aplica o no una regla de re-escritura (RewriteRule). La CadenaEvaluada es por lo general una referencia a una variable del entorno, por ejemplo la REQUEST_URI, que será comparada contra el Patrón que es una expresión regular.

De esta manera la CadenaEvaluada será comparada con la expresión regular en Patrón y si coincide (matchea) será ejecutada la regla de escritura siguiente.

Por ejemplo:
# La regla se ejecutará si el REQUEST_URI empieza con /espanol/
RewriteCond %{REQUEST_URI} /espanol/.*
RewriteRule ....re-escribimos de alguna manera...

RewriteRule Patrón Re-escritura
Esta es la directiva con la cual se realiza la re-escritura de la URL, el patrón responde a la especificación antes vista y la re-escritura puede ser un texto con referencias previas (back-references). Es decir, todo lo que concuerde con el patrón será re-escrito según Re-escritura.

Por ejemplo:
#Todo lo que empiece con español lo re-escribimos como index.es.html
RewriteRule /espanol/.* /index.es.html

Ahora mezclando todo:

# Si el REQUEST_URI empieza con /es/ o /en/ o /ru/
RewriteCond %{REQUEST_URI} /(es|en|ru)/.*

#Re-escribo la url por index.es.html o index.es.html o index.es.html
#Según corresponda.
RewriteRule /(.*)/.* /index.$1.html

Páginas: 1 2 3 4 5 6 7

26 comentarios

26 respuestas a 'Optimizando las URLs para la búsqueda'

Suscríbete a los comentarios con RSS o realiza un TrackBack a 'Optimizando las URLs para la búsqueda'.

  1. olga dijo,

    el Enero 10th, 2006 a las 6:35 am

    Me gustaría saber que diferencias de rendimiento habría entre los 3 métodos, si las hay, y en que deberíamos basarnos para elegir uno u otro.

    Por otro lado felicitaros por el artículo, ya que me ha sido de gran ayuda.

    Muchas gracias
    Un saludo

  2. José Carlos dijo,

    el Enero 25th, 2006 a las 10:49 am

    Hola,
    pensad que también podéis trabajar de una manera más cómoda si haceis uso de la variable PATH_INFO desde php.
    En mi blog comento el uso de la misma:
    http://jcasamitjana.blogspot.com/2006/01/indexar-pginas-dinmicas-en-buscadores.html

  3. xiborg dijo,

    el Febrero 14th, 2006 a las 12:58 pm

    hola tengo una duda como seria si kisiera darle mod_rewriter a una url que contiene caracteres como

    este-es-mi-titulo.html

    me refiero a los – o a los _

  4. lolo dijo,

    el Marzo 2nd, 2006 a las 8:52 am

    Hola kiero hacer un generador de noticias rss totalmente automatico para una web, que coja las noticias de una base de datos o una pagina php, pero no tengo ni idea de como hacerlo, he encontrado cosas por internet, pero no se como juntarlas todas para conseguirlo. Una ayudita po favo, ke toy haciendo las practicas sin cobrar y encima sin saber nada de php

  5. Mr. Mxyzptlk dijo,

    el Marzo 9th, 2006 a las 6:53 pm

    Muy buen artículo! Lo único que creo queda en el tintero es el tema de Rewrite en Windows. Por ejemplo, cómo hacemos para convertir a URLs “amigables” las generadas en el artículo “Creando Webs Modulares”.
    Por ejemplo, yo tengo Apache + PHP + MySQL en Win XP y si bien el mod_rewrite está funcionando (lo he probado con una regla sencilla y tambien funciona con Textpattern), no he conseguido transformar una URL como http://dominio1/index.php?mod=home a algo “indexable”.

  6. Lugano dijo,

    el Marzo 11th, 2006 a las 3:17 pm

    Quisiera saber si hay forma de VER la dirección real que el mod_rewrite está enmascarando… y como?

    Gracias excelente este artículo… muy bueno.!

  7. Luis dijo,

    el Mayo 5th, 2006 a las 6:39 pm

    Este es muy buen articulo y funciona de maravilla.

    Solo que ami no me funcion con el ejemplo original

    RewriteEngine on
    RewriteRule /articulo/(.+)/(.+) /articulo.php?id=$1&pagina=$2

    tuve que hacerle un pequeno cambio

    RewriteEngine on
    RewriteRule articulo/(.+)/(.+) articulo.php?id=$1&pagina=$2

    Saludos
    Luis Villarino
    http://www.lasvegaswh.com

  8. Xyyy7 dijo,

    el Mayo 9th, 2006 a las 5:28 pm

    Tremendo articulo amigo.-

  9. Pablo dijo,

    el Mayo 10th, 2006 a las 4:04 pm

    hola, os paso esta página que me ha servido a mi para formar la expresion regular que se utiliza para el metodo del mod_rewrite

    http://www.mod-rewrite-wizard.com/

    Saludos

  10. Mariano dijo,

    el Junio 5th, 2006 a las 11:43 pm

    Muy bueno, gracias. aca encontre otro articulo de gran utilidad,
    http://www.baluart.net/articulo/403/urls-amigables-con-php.php

    que aunque habla de urls amigables, no la tiene :)

    Un saludo

  11. Luis dijo,

    el Junio 7th, 2006 a las 10:23 am

    Pero mariano, según la url del enlace si son amigables jeje.

    Muy buenos ambos artículos, ma han servido de mucho.

    Saludos.

  12. Sergio dijo,

    el Agosto 2nd, 2006 a las 4:45 pm

    Alguien me puede orientar en como capturar el mismo error que se registra en el logfile ? (ademas de $php_errormsg)
    Gracias

  13. Williams dijo,

    el Agosto 10th, 2006 a las 12:18 pm

    funciona Bien

  14. Tom Lee dijo,

    el Agosto 29th, 2006 a las 12:46 pm

    Very Good, muy bueno

    Thanks
    Luis
    http;//friendlycomputers.com

  15. Ed00m dijo,

    el Octubre 15th, 2006 a las 9:45 am

    Querias preguntarle si podian dar un ejemplo completo desde el index.php con este ejemplo pues no entendi como se hacia, es una pagina modular que quiero transformar a este tipo de url para el google, es un tipo index.php?modulo=noticias y quiero cambiarlo a index/noticias o sino index.php?modulo=noicias&id=2 y que quede index/noticias/2 dando un ejmplo ficticio como debo hacerlo para cambiar las urls¡?¿

    gracias

  16. Spielberg dijo,

    el Noviembre 14th, 2006 a las 10:11 am

    Muy bueno el artículo, sólo quería dar mi granito de arena en la segunda de las propuestas. Qué te parece sustituir el if por algo del tipo;

    if ($url[1] == ‘articulo’ and ( isset($url[2]) && !empty($url[2]) ) and ( isset($url[3]) && !empty($url[3] )))

    es que si sólo ponias un parámetro tb se cargaba la página. Bueno, espero sus opiniones;

    Javi

  17. Enmanuel dijo,

    el Enero 16th, 2007 a las 3:44 pm

    Hola a todos, mas que un comentario quiero hacer una consulta ya que esta me atormenta ya hace una semana.

    Segun el articulo uno puede hacer que el apache interprete por ejemplo http://www.dominio.com/noticias-43.htm por http://www.dominio.com/noticias.php?id=43.

    Entonces si quisiera volver la url mas entendendible podria utilizar el titular en este caso de una noticia de la siguiente forma:

    http://www.dominio.com/noticias-43-nombre-titular.htm

    interpretando esto de forma real:
    http://www.dominio.com/noticias.php?id=43&titular=nombretitular

    Mi pregunta es que si en el .htacces puedo hacer que me interprete http://www.dominio.com/noticias-nombre-titular.htm

    sin necesidad de mostrar el codigo de la noticia en la url cambiada.

    Pero que si pase esta para poder realizar la consulta a la bd por el codigo.

    Espero este clara mi pregunta.
    Gracias

  18. joaquin dijo,

    el Enero 26th, 2007 a las 11:58 am

    he probado el codigo php capturar.php pero no me funciona, lo que note que la funcion $url = explode(’/', $_uri); no esta funcionando ya que la variable $url[1] tiene toda la cadena articulo.php?id=XXX&pagina=YYY y las demas variables $url[2] y $url[3] no tienen ningun valor, que puede estar pasando?

  19. martin dijo,

    el Abril 26th, 2007 a las 8:50 am

    Mi opinion es que actualmente los motores de búsqueda si que indexan URL’s tipo:

    http://misitio.com/articulo.php?id=10&pagina=2

    Antes no lo hacian pero no hay razón para que este URL no sea indexado ya que es un contenido valido.
    Por supuesto es mejor que las URL’s no lleven muchas variables tipo GET en la dirección. Pero eso no significa que no sean indexados.

    Si quieren corroborarlo hagan la siguiente búsqueda ( noticia.php/?id= ) en Google:
    http://www.google.com/search?q=noticia.php%2F%3Fid%3D

  20. Marco Antonio dijo,

    el Junio 18th, 2007 a las 6:44 pm

    Tengo un problema como le hago para enexar un video a mi pagina web

  21. .htaccess dijo,

    el Octubre 14th, 2007 a las 1:52 pm

    [...] .htaccess. Mundo Geek – Software, linux, tecnología, gadgets e internet. — Sobre mod_rewrite: ZonaPHP » Optimizando las URLs para la búsqueda Aeoris.net – Reescribir direcciones con mod_rewrite de Apache MOD_REWRITE Ayuda para covertir paginas Web dinamicas en paginas estaticas. [...]

  22. Rommel dijo,

    el Octubre 30th, 2007 a las 6:14 pm

    Como uso el mod_rewrite con webs modulares, me podrin ayudar por favor.
    gracias

  23. Fernando dijo,

    el Julio 21st, 2008 a las 9:51 pm

    Que porqueria, eres un monstruo viejo – De casualidad no eres colombiano?, era lo que andaba buscando… no podia estar satisfecho hasta lograr llegar al asunto. Es mucho mejor que pasar los datos por get. y Si el termino es “Muy profesional”. Me diste en el clavo, que nota y “me salvaste el cuello… por que dentro de poco debo entregar una aplicacion modular y no estaba conforme con el uso de GET”… Pero busque, Y apareciste, como un foco en medio de la oscuridad.

    Le debo una invitacion a tomar politas frias.

    Gracias, mi hermano… Un saludo especial desde Colombia!


  24. el Julio 30th, 2008 a las 5:09 am

    [...] ZonaPHP, BaluArt, Unijimpe     Read More    Post a [...]

  25. Abaddon dijo,

    el Septiembre 16th, 2008 a las 8:26 pm

    Excelente artículo sí señor, pero me asalta una duda, ¿se puede emplear sin problemas en un servidor de pago?

    Saludos

  26. LiveShar dijo,

    el Octubre 31st, 2009 a las 8:27 am

    Como uso el mod_rewrite con webs modulares, me podrin ayudar por favor.
    gracias

Deja un comentario