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.
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.
Miguel Angel Alvarez
Fundador de DesarrolloWeb.com y la plataforma de formación online EscuelaIT. Com...