Aprendiendo a usar “mod_rewrite” en Apache
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)







Youssef
22/11/2007 - 16:46
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
admin
22/11/2007 - 17:57
Necesitaría que me concretaras un poco más con algún ejemplo. Un saludo.
Buscando alternativas a Adobe Dreamweaver | LinkAlicante
14/02/2008 - 1:24
[...] “cómoda” la edición de los archivos .htaccess, tan necesarios cuando queremos usar mod_rewrite en nuestro sitio web (al menos en remoto, trabajando directamente contra el ftp, no lo he [...]
crok
18/05/2008 - 16:16
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 :/
LinkAlicante
21/05/2008 - 19:25
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
ziggy
13/06/2008 - 13:04
“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
ziggy
13/06/2008 - 13:10
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.
LinkAlicante
13/06/2008 - 20:14
Gracias por la aportación “ziggy”. Creo que pasé por lo mismo que comentas…
Marconi Poveda
5/07/2008 - 19:27
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.
LinkAlicante
6/07/2008 - 12:04
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!
Ana
21/08/2008 - 22:10
Ojala y puedan ayudarme.
Ana
21/08/2008 - 22:16
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
fer
23/08/2008 - 10:12
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.
Ana
25/08/2008 - 16:28
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. : )
Ana
25/08/2008 - 17:15
Perdon Websphere Application Server