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

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

Estou tendo problemas com esta reescrita. Eu nunca usei mod_rewrite antes e não tenho muita experiência com regex. Qualquer ajuda é 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>

Isso funciona parcialmente,http://www.site.com/dir/é encaminhado parahttp://www.site.com/dir/2009/mas um pedido comohttp://www.site.com/dir/css/theme.cssfalha. Espero reescrever todas as solicitações do diretório pai no subdiretório de 2009, mas continuo encontrando loops infinitos e mensagens de erros do servidor. Não encontrei nenhum exemplo útil por aí. Achei que isso seria uma reescrita comum ...

Desde já, obrigado!

Responder1

Existem alguns problemas com a regra de reescrita no seu exemplo. Primeiro de tudo, ele realmente não faz o que você quer - você não precisa %{REQUEST_URI}de nada. Com o caminho original como /dir/css/theme.cssREQUEST_URI conterá /dir/css/theme.csse $1 conterá css/theme.css(correspondido por (.*)), resultando no URL final sendo /dir/css/theme.css2009/css/theme.css. Portanto, precisamos nos livrar da %{REQUEST_URI}parte que nos deixa seguindo RewriteRule

^(.*)$ 2009/$1 [L,NE]

isso se traduzirá /dir/css/theme.cssem /dir/2009/css/theme.css.

No entanto, ainda há um problema com essa regra, pois causará aninhamento infinito, pois (.*) corresponderá a qualquer URL. Então o que acontece é que na primeira etapa nosso URL de exemplo é reescrito para /dir/2009/css/theme.css. E como o novo URL /dir/2009/css/theme.csstambém corresponde à nossa regra, ele será reescrito novamente, e novamente e novamente...

Então, basicamente, precisamos de algo que impeça a reescrita de URLs que já foram reescritas. Portanto, se o URL já contém, /dir/2009queremos que o Apache o deixe em paz. Uma maneira de conseguir isso é adicionar a seguinte condição à regra de reescrita

RewriteCond %{REQUEST_URI} ^(?!/dir/2009).*$

com o arquivo .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>

Outra maneira de fazer isso é criar o arquivo .htacess no diretório dir/2009, o que impedirá o Apache de usar o do diretório pai com algo como RewriteEngine off. Ou talvez RewriteEngine onsem nenhuma regra também deva funcionar.

informação relacionada