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 »

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.

  1.  
  2.     RewriteRule (.*)/index\.(htm|html|php)(/?)$ $1/ [R,L]
  3.     RewriteBase /
  4.     RewriteRule ^(.*)\.(htm|html|php)$ $1 [C,E=Wa.html:yes]
  5.     RewriteCond %{REQUEST_FILENAME}.php -f
  6.     RewriteRule ^(.*)$ $1.php [S=2]
  7.     RewriteCond %{REQUEST_FILENAME}.htm -f
  8.     RewriteRule ^(.*)$ $1.htm [S=1]
  9.     RewriteCond %{ENV:Wa.html} ^yes$
  10.     RewriteRule ^(.*)$ $1
  11.     RewriteRule ^(cgi-bin|cache)(/.*)?$ - [S=5]
  12.     RewriteRule ^(.*)\.(css|cgi|jpg|png|gif)$ - [S=4]
  13.     RewriteRule ^(.*)_(.*)$ /$1-$2 [R=301,L]
  14.  

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

  1.  
  2.     RewriteBase /
  3.     RewriteRule ^(.*)\.(htm|html|php)$ $1 [C,E=Wa.html:yes]
  4.     RewriteCond %{REQUEST_FILENAME}.php -f
  5.     RewriteRule ^(.*)$ $1.php [S=2]
  6.     RewriteCond %{REQUEST_FILENAME}.htm -f
  7.     RewriteRule ^(.*)$ $1.htm [S=1]
  8.     RewriteCond %{ENV:Wa.html} ^yes$
  9.     RewriteRule ^(.*)$ $1
  10.  

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

  1.  
  2.     RewriteRule ^(cgi-bin|cache)(/.*)?$ - [S=5]
  3.     RewriteRule ^(.*)\.(css|cgi|jpg|png|gif)$ - [S=4]
  4.     RewriteRule ^(.*)_(.*)$ /$1-$2 [R=301,L]
  5.  

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

  • Abr
  • 10

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


  • Abr
  • 14

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


Escribe tu comentario

Puedes utilizar este formulario para escribir tu opinion sobre esta entrada, no existe ningun tipo de limitacion a la hora de enviar opiniones, tan solo sigue unas reglas basicas de cortesia y todos estaremos mas contentos.

Puedes identificarte utilizando OpenID, solo tienes que introducir tu URL OpenID en el siguiente campo y pulsar el boton de validar.





Instrucciones para los comentarios

El simbolo * indica que se trata de un campo obligatorio.

Este sitio usa Markdown junto con Smartypants para educar los textos, tambien esta disponible para los comentarios.

A continuación os muestro algunas de las equivalencias:

  • [enlace de ejemplo](http://example.com/) resulta enlace de ejemplo.
  • **Texto en Negrita**
  • _Italica_
  • > blockquote
  • > > nested blockquote
  • * Esto es un elemento de una lista desordenada (ul)
  • 1. Esto es un elemento de una lista ordenada (ol)

MC Puedes seguir las respuestas a tus comentarios con MyComments.