[Esta entrada fue escrita originalmente el 16 de octubre de 2007 en linkalicante.com, y ha sido trasladada a este nuevo blog el día 15 de febrero de 2010]

Gracias a mi reciente incursión en el mundo de los blogs (www.linkalicante.com), he conocido la posibilidad de utilizar “Mod Rewrite” para crear urls amigables, favoreciendo sobre todo el posicionamiento en buscadores (google) de mis entradas en el blog. Mod_rewrite es un módulo (funcionalidad) del servidor web Apache, que se puede configurar haciendo uso de los archivos “.htaccess”.

ACLARACIÓN IMPORTANTE: mod_rewrite no reescribe la url en la barra del navegador. Esto lo hacemos nosotros. Lo que hace mod_rewrite es traducir esa url amigable que nosotros usamos en nuestros enlaces, por la “url dinámica real” que cargará el contenido correspondiente usando php y mysql (o la tecnología del servidor en cuestión).

Buscando en foros y demás, al final he conseguido entender cómo funciona mod_rewrite, y al mismo tiempo aclarar mis ideas. No he encontrado ningún sitio donde se diga esto claramente, y creo que puede llevar a error a mucha gente. Somos nosotros los que usaremos enlaces del tipo “/categoria/post_bueno_para_google_456.html”, y mod_rewrite hará la “traducción” de forma que finalmente se llame a “/categoria/verpost.php?id=546″.

Mod_rewrite, después de todo, es sólo uno de los muchos módulos que puede incorporar apache. Es realmente potente, pero un poco difícil de entender. Yo no voy a entrar en este post en detalle en la sintaxis de los archivos .htaccess, que es donde indicaremos a mod_rewrite cómo actuar. Simplemente os pongo un pequeño ejemplo:


Options +FollowSymLinks
RewriteEngine on
Rewriterule ^noticia/(.*).html$ noticia.php?n=$1

Las dos primeras líneas activan mod_rewrite. La tercera es la regla que nos dice cómo hacer la “traducción”, y hace uso de expresiones regulares, que es el factor que posiblemente añade más complejidad al asunto.

Os pongo el mejor link que he encontrado sobre este tema (aunque repito que es un poco confuso, porque ni en este ni en otros sitios explican que mod_rewrite no reescribe la url en el navegador. Tú debes llamar a las url amigables en tus enlaces, y mod_rewrite las traduce por las “url feas” reales en php:

http://www.aeoris.net/escritos/apache/reescribir-direcciones-con-mod_rewrite.html

Añado un segundo enlace bastante bueno que he encontrado:

http://perlenespanol.baboonsoftware.com/articulos/archivo/000180.html

Configurar Apache para usar mod_rewrite (httpd.conf)

Para que “mod_rewrite” funcione correctamente en nuestro Apache, es necesario editar httpd.conf y cambiar un par de cosillas:

Es necesario descomentar esta línea:

  • LoadModule rewrite_module modules/mod_rewrite.so

Y cambiar un par de cosas en “<directory>”:

<Directory />
Options FollowSymLinks
AllowOverride All
</Directory>
__________________
# “AuthConfig”, and “Limit”
#
AllowOverride All

(en negrita los cambios: None se sustituye por All) (en realidad el All es muy permisivo y podría ocasionar problemas de seguridad, pero si es solo para hacer pruebas nos sirve)

21 responses


Do you want to comment?

Comments RSS and TrackBack Identifier URI ?

Gracias amigo por la esxplicacion, salgo del trabajo y voy a casa a probarla, espero que funcione, estaba buscando de hace mucho de como hacer algo asi, me gusta mucho, lo que te pederia es que en caso en que yo quesiera que una variable no salga en la url nueva, como lo podemos hacer?

Saludos y gracias

November 22, 2007 16:46

Necesitaría que me concretaras un poco más con algún ejemplo. Un saludo.

November 22, 2007 17:57


Hola, lo primero muchas gracias por la clara explicación. La verdad, quiero empezar a usar mod_rewrite y estoy intentando entenderlo leyendo en foros, tutoriales y demas, pero tengo algunos problemas a los que no encuentro explicacion, a ver si alguien me puede ayudar. Siguiendo tu ejemplo, me funciona correctamente siempre que el archivo ‘noticia’ no exista. Si ya existe por ejemplo ‘noticia.php’ al poner la url noticia/123456.html me carga siempre noticia.php y no coge los parametros ni nada. El error puede estar en alguna configuracion de mi apache? porque tampoco me parece bien que poniendo dominio.com/prueba se carge la pagina dominio.com/prueba.php
No se si he logrado explicarme :/

May 18, 2008 16:16

Ten en cuenta que mod_rewrite toma como parámetros aquello que va entre paréntesis. Por ejemplo, en este caso:

Rewriterule ^noticia/(.*).html$ noticia.php?n=$1

Lo que va entre paréntesis es “(.*)” se toma como el primer parámetro, por lo tanto es $1. Si hubiera más parámetros serían $2, $3, etc.

El símbolo “^” indica el comienzo de la expresión regular, y el “$” indica el fin de la misma. Mírate algo sobre expresiones regulares para tenerlo más claro. Espero haber sido de ayuda.

Saludos

May 21, 2008 19:25

“ACLARACIÓN IMPORTANTE: mod_rewrite no reescribe la url en la barra del navegador. Esto lo hacemos nosotros. ”
————————————————————————————
Gracias gracias gracias
Es lo que necesitaba escuchar (leer)
He estado buscando por todos laos y en ningún sitio lo dice tan claro como tú… joder ya. Desde luego que te pongo en favoritos.
Bueno, ahora me leeré el resto del artículo.

Salud

June 13, 2008 13:04

Yo otra vez.
Me ha quedado muy clara la cosa.
Pero ya tengo mi sitio web hecho y terminado, con cerca de 200 páginas … ¿que tengo que ponerme a cambiar links como un loco?. Pues menos mal que has puesto la aclaración importante, porque ahora sí que paro definitivamente de hacer esto, o al menos lo haré con unas cuantas páginas na más.

Gracias.

June 13, 2008 13:10

Gracias por la aportación “ziggy”. Creo que pasé por lo mismo que comentas… :)

June 13, 2008 20:14

Hola Linkalicante,

He probado un par de cosas, pero no estoy claro que sea lo correcto.

Cargar el modulo

$sudo a2enmod rewrite.

La URL que quiero esconder es http://www.example.com/index.php?paso=1

He hecho lo siguiente, en la definision del virtual host he colocado

RewriteBase instalar/
RewriteEngine On
RewriteBase ^paso-([0-9]+)\.html$ index.php?paso=$1

Pero al reiniciar apache me da el error

mapo@mobile:/etc/apache2/sites-available$ sudo /etc/init.d/apache2 restart
* Restarting web server apache2 Syntax error on line 7 of /etc/apache2/sites-enabled/marconi.com:
RewriteBase: only valid in per-directory config files
[fail]

Quiza puedes darme una pequena ayuda.

Saludos.

July 5, 2008 19:27

Marconi: Voy a intentar ayudarte, pero aviso que no soy ningún experto…

En cuanto a la parte de cargar el módulo, yo tenía entenido que simplemente había que indicarlo en el httpd.conf (no sé si esto es realmente así).

En cuanto al código que pones, creo que la linea “RewriteEngine On” debería ser la primera.

Espero que te sirva de ayuda…

Saludos!

July 6, 2008 12:04

Ojala y puedan ayudarme. :(

August 21, 2008 22:10

Hola estoy tratando de redireccionar un URL pero aun tengo muchas dudas.

Ojala me puedan ayudar

Mira estoy tratando de redireccionar el siguiente link:
** http://jalisco.server.com:100038/wps/port
por el siguiente dominio:
** http://jalisco.server.com

por lo que he leido el apache mod-rewrite ayuda a esto pero la aplicacion no esta corriendo sobre apache si no sobre el WAS y no se si este apache mod-rewrite funcione aunq no este la aplicacion corriendo sobre el?

se puede usar el apache mod.rewrite solo para configurar los URL?

Bueno les agradeceria mucho su ayuda :( Gracias

August 21, 2008 22:16

Ana: me temo que no puedo ayudarte demasiado, no conozco WAS (son las siglas de websphere application software?).

Lo que sí te puedo decir es que normalmente los diferentes servidores tienen soluciones similares al mod_rewrite de apache.

August 23, 2008 10:12

Hola Fer
Estas en lo correcto son las siglas del Websphere application software.

Gracias por contestarme y dejame checar si en el WAS hay algo que me ayude.

Gracias. : )

August 25, 2008 16:28

Perdon Websphere Application Server

August 25, 2008 17:15


Se os ocurre como podría hacer para que la url de la barra de dirección nunca cambiara?
Mil gracias

November 6, 2008 14:13

Dolce: para eso lo mejor sería usar una redirección con frame oculto, pero está totalmente desaconsejado desde el punto de vista SEO.

Un saludo

November 6, 2008 20:41


Como seria mie expresion si tengo mi url es asi http://www.onlinecomitan.com.mx/?mod=mod_art&opcion=mostrar&item=1, e estado buscando pero no encuentro la solucion gracias por su valiosa ayuda

October 25, 2009 01:04

Necesito ayuda con lo siguiente, necesito cambiar el modo como se muestra la URL de http://www.empresa.com/carpeta/articulo.htm a http://www.empresa.com/articulo.htm, por lo que he leido, se que se puede, pero no se como.

December 31, 2009 06:09

Comment now!