mod_rewrite www.site.com/dir/ --> www.site.com/dir/2009/

mod_rewrite www.site.com/dir/ --> www.site.com/dir/2009/

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.cssREQUEST_URI contendrá /dir/css/theme.cssy $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.cssen /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.csstambié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/2009queremos 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 onsin reglas también debería funcionar.

información relacionada