A prueba de fallos
- Abr
- 08
2 comentarios! 95 palabras - 1 hits
Reescribiendo las url con apache y mod_rewrite
Estos días he estado buscando la manera de hacer las url’s de este sitio un poco más amigables, para conseguir este proposito, nada mejor que utilizar el mod_rewrite del Apache.
El objetivo
Conseguir que los usuarios accedan a la url real aunque en la barra del navegador no la escriban correctamente.
Pongamos un ejemplo para verlo mas claramente:
Url Real »
Variables Soportadas »
- http://alexsancho.name/archives/2005/04/spam-en-las-bitacoras.htm
- http://alexsancho.name/archives/2005/04/spam-en-las-bitacoras.html
- http://alexsancho.name/archives/2005/04/spam-en-las-bitacoras.php
- http://alexsancho.name/archives/2005/04/spam-en-las-bitacoras/index.htm
- http://alexsancho.name/archives/2005/04/spam-en-las-bitacoras/index.html
- http://alexsancho.name/archives/2005/04/spam-en-las-bitacoras/index.php
- http://alexsancho.name/archives/2005/04/spam-en-las-bitacoras/index
- http://alexsancho.name/archives/2005/04/spam-en-las-bitacoras/index.htm
- http://alexsancho.name/archives/2005/04/spam-en-las-bitacoras/index.html/
- http://alexsancho.name/archives/2005/04/spam-en-las-bitacoras/index.php/
- http://alexsancho.name/archives/2005/04/spam-en-las-bitacoras/index/
- http://alexsancho.name/archives/2005/04/spam_en_las_bitacoras/
- http://alexsancho.name/archives/2005/04/spam_en_las_bitacoras
- http://alexsancho.name/archives/2005/04/spam_en_las_bitacoras.htm
- http://alexsancho.name/archives/2005/04/spam_en_las_bitacoras.html
- http://alexsancho.name/archives/2005/04/spam_en_las_bitacoras.php
- http://alexsancho.name/archives/2005/04/spam_en_las_bitacoras/index.htm
- http://alexsancho.name/archives/2005/04/spam_en_las_bitacoras/index.html
- http://alexsancho.name/archives/2005/04/spam_en_las_bitacoras/index.php
- http://alexsancho.name/archives/2005/04/spam_en_las_bitacoras/index
- http://alexsancho.name/archives/2005/04/spam_en_las_bitacoras/index.htm/
- http://alexsancho.name/archives/2005/04/spam_en_las_bitacoras/index.html/
- http://alexsancho.name/archives/2005/04/spam_en_las_bitacoras/index.php/
- http://alexsancho.name/archives/2005/04/spam_en_las_bitacoras/index/
Como veis, he tratado de cubrir el mayor numero de posibilidades, tratando de redireccionarlas todas hacia la url original, si estaís interesados en saber como lo he conseguido, seguir leyendo.
La Solución
Utilizando las siguientes reglas en el fichero .htaccess.
- RewriteRule (.*)/index\.(htm|html|php)(/?)$ $1/ [R,L]
- RewriteBase /
- RewriteRule ^(.*)\.(htm|html|php)$ $1 [C,E=Wa.html:yes]
- RewriteCond %{REQUEST_FILENAME}.php -f
- RewriteRule ^(.*)$ $1.php [S=2]
- RewriteCond %{REQUEST_FILENAME}.htm -f
- RewriteRule ^(.*)$ $1.htm [S=1]
- RewriteCond %{ENV:Wa.html} ^yes$
- RewriteRule ^(.*)$ $1
- RewriteRule ^(cgi-bin|cache)(/.*)?$ - [S=5]
- RewriteRule ^(.*)\.(css|cgi|jpg|png|gif)$ - [S=4]
- RewriteRule ^(.*)_(.*)$ /$1-$2 [R=301,L]
Si desglosamos las reglas aplicadas, nos encontramos con lo siguiente.
RewriteRule (.*)/index\.(htm|html|php)(/?)$ $1/ [R,L] Para empezar, quitaremos la variable index independientemente de la extensión que tenga, dejando solo la url canonica, asegurandonos de acabarla con un “slash” final.
Con la siguiente regla
- RewriteBase /
- RewriteRule ^(.*)\.(htm|html|php)$ $1 [C,E=Wa.html:yes]
- RewriteCond %{REQUEST_FILENAME}.php -f
- RewriteRule ^(.*)$ $1.php [S=2]
- RewriteCond %{REQUEST_FILENAME}.htm -f
- RewriteRule ^(.*)$ $1.htm [S=1]
- RewriteCond %{ENV:Wa.html} ^yes$
- RewriteRule ^(.*)$ $1
conseguiremos quitar la extensión de cualquier fichero introducido en la url si este no existe en nuestro sitio, lo que nos permite cambiar la extensión de nuestros ficheros siempre que queramos.
Para acabar, aplicamos una regla que convierta todos los guines bajos en guiones normales
- RewriteRule ^(cgi-bin|cache)(/.*)?$ - [S=5]
- RewriteRule ^(.*)\.(css|cgi|jpg|png|gif)$ - [S=4]
- RewriteRule ^(.*)_(.*)$ /$1-$2 [R=301,L]
hay que tener un especial cuidado con esta regla, porque puede hacer que algunos scripts dejen de funcionar al cambiar la url, con lo que me aseguro de que no se aplique en aquellos ficheros/directorios sensibles a este cambio. Como observais, si esta ultima regla es aplicada, envia una redirección permanente con lo que el cambio de url se ve reflejado en la barra del navegador.
Por el momento esta es la menera que he usado en este sitio, aunque sigo probando diferentes opciones, con la intención de ampliar el abanico de posibilidades.
¿Se os ocurren otras posibilidades?
2 comentarios
# Escrito por Federico hace 5 años, 3 meses
Viendo la cantidad de variables, sólo se me ocurre el deseo de que los navegantes no escribieran URLs.
# Escrito por stan hace 5 años, 3 meses
Hace unos dias me preguntaba como hacerlo, hoy leo tu post y ya tengo la idea de como funciona.
Lamentablemente estoy en un server windows y sin apache.
Habra que esperar un poco mas, Saludos.