Redirecciones cíclicas con .htaccess

  • Por
Un error típico al realizar redirecciones con htaccess es crear un redireccionamiento cíclico.
Nuestro manual de crear URLs amigables a buscadores con htaccess continua comentando algunos de los errores típicos que se pueden cometer a la hora de definir las reglas de redirección.

En mi experiencia con .htacces he encontrado que es fácil hacer un redireccionamiento cíclico. Es decir, definir un RewriteRule con un patrón que redirecciona a una URL que sigue cumpliendo el patrón. Como esa segunda URL concuerda todavía con el patrón, se volverá a redirigir y seguirá cumpliendo el patrón, con lo que se volverá a redirigir. Y así indefinidamente.

Al escribir una dirección del dominio que cumpla el patrón, el resultado de este problema de redirección cíclica será que Apache nos presentará un error "Internal Server Error", pero no será mucho más descriptivo, por lo que podría complicarse identificar el problema. Fijémonos en esta regla de redirección:

RewriteRule ^dir/(.+)\.php dir/codigo.php?articulo=$1

Quiere decir que cualquier URL del directorio "dir" que acabe en .php, se redirigirá a dir/codigo.php?articulo=xxx. Por ejemplo:

http://www.midominio.com/dir/loquesea.php

Se redirigirá a: http://www.midominio.com/dir/codigo.php?articulo=loquesea

Como se puede ver, la URL a la que se redirigirá cumple también el patrón, porque la URL a la que se accede también está dentro del directorio "dir" y acaba en PHP. (No se tiene en cuenta para comprobar el patrón el parámetro que se pasa por la URL)

Ese RewriteRule sería incorrecto, por padecer una redirección cíclica. Para solucionarlo podemos hacer varias cosas. Por ejemplo, redirigir a una URL que no esté dentro del directorio dir.

RewriteRule ^dir/(.+)\.php codigo-dir/codigo.php?articulo=$1

Esto funcionaría bien. La URL de antes http://www.midominio.com/dir/loquesea.php

Será redirigida hacia http://www.midominio.com/codigo-dir/codigo.php?articulo=loquesea

Otra solución que a veces he utilizado es redirigir direcciones acabadas en .html a direcciones acabadas en .php. Como las terminaciones son distintas, no habrá redirecciones cíclicas:

RewriteRule ^dir/(.+)\.html dir/codigo.php?articulo=$1

Por ejemplo, para la URL: http://www.midominio.com/dir/otracosa.html

La redirigirá a: http://www.midominio.com/dir/codigo.php?articulo=loquesea

Esta última URL, como no acaba en .html no cumplirá el patrón y no tendremos la redirección cíclica.

Autor

Miguel Angel Alvarez

Miguel es fundador de DesarrolloWeb.com y la plataforma de formación online EscuelaIT. Comenzó en el mundo del desarrollo web en el año 1997, transformando su hobby en su trabajo.

Compartir

Comentarios

juan pablo

08/3/2008
bueno tengo una duda y kisiera saber como hago para hacer esto kiero que una pagina web se vea asi dedicar.php?amo=ruth por esta dedicar/ruth.html la pagina dedicar.php trabaja con get es un archivo sencillo de hacer solo remplaza alguien me podria ayudar en esto por favor kiero hacerlo con .htacces
RewriteRule ^dedicar/(.+).html index.php?amo=$1
pero no me sale

David

11/6/2009
te ayudo un poco
RewriteRule ^dedicar/(.+).html$ dedicar.php?amo=$1

Así esta correcto, ya lo verás.

Arkiant

09/4/2011
Concretamente...
RewriteRule ^dedicar/(.+).html$ dedicar.php?amo=$1

esta mal por una sencilla raz?tienes que escapar el punto de html es decir:

RewriteRule ^dedicar/(.+).html$ dedicar.php?amo=$1

Si no pones la barra invertida lo toma como . que en expresiones regulares viene a ser cualquier car?er que no sea espacio, salto de linea etc.

Un saludooo