Tengo problemas con esta reescritura. Realmente nunca antes había usado mod_rewrite y no tengo mucha experiencia con expresiones regulares. ¡Cualquier ayuda es apreciada!
<IfModule mod_rewrite.c>
Options +FollowSymLinks
RewriteEngine on
#prevent nested looping
RewriteCond %{ENV:REDIRECT_STATUS} ^$
#re-route incoming requests
RewriteRule ^(.*)$ %{REQUEST_URI}2009/$1 [L,NE]
</IfModule>
Esto funciona parcialmente,http://www.site.com/dir/se dirige ahttp://www.site.com/dir/2009/pero una petición comohttp://www.site.com/dir/css/theme.cssfalla. Espero reescribir todas las solicitudes al directorio principal en el subdirectorio 2009, pero sigo encontrando bucles infinitos y mensajes de error del servidor. No he encontrado ningún ejemplo útil por ahí. Pensé que esta sería una reescritura común...
¡Gracias de antemano!
Respuesta1
Hay algunos problemas con la regla de reescritura en su ejemplo. En primer lugar, en realidad no hace lo que quieres: no necesitas %{REQUEST_URI}
nada. Con la ruta original como /dir/css/theme.css
REQUEST_URI contendrá /dir/css/theme.css
y $1 contendrá css/theme.css
(coincidido con (.*)
), lo que dará como resultado que la URL final sea /dir/css/theme.css2009/css/theme.css
. Entonces necesitamos deshacernos de la %{REQUEST_URI}
parte que nos deja con la siguiente RewriteRule
^(.*)$ 2009/$1 [L,NE]
eso se traducirá /dir/css/theme.css
en /dir/2009/css/theme.css
.
Sin embargo, todavía hay un problema con esa regla, ya que provocará un anidamiento infinito ya que (.*) coincidirá con cualquier URL. Entonces, lo que sucede es que en el primer paso nuestra URL de ejemplo se reescribe en /dir/2009/css/theme.css
. Y dado que la nueva URL /dir/2009/css/theme.css
también coincide con nuestra regla, se reescribirá nuevamente, y luego una y otra vez...
Básicamente, necesitamos algo que impida reescribir las URL que ya fueron reescritas. Entonces, si la URL ya contiene /dir/2009
queremos que Apache la deje como está. Una forma de lograrlo es agregar la siguiente condición a la regla de reescritura
RewriteCond %{REQUEST_URI} ^(?!/dir/2009).*$
con un archivo .htaccess final como este
<IfModule mod_rewrite.c>
Options +FollowSymLinks
RewriteEngine on
RewriteBase /dir
RewriteCond %{REQUEST_URI} ^(?!/dir/2009).*$
#re-route incoming requests
RewriteRule ^(.*)$ 2009/$1 [L,NE]
</IfModule>
Otra forma de hacerlo es crear un archivo .htacess en el directorio dir/2009, lo que evitará que Apache use el del directorio principal con algo como RewriteEngine off
. O tal vez RewriteEngine on
sin reglas también debería funcionar.