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.css
REQUEST_URI conterá /dir/css/theme.css
e $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.css
em /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.css
també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/2009
queremos 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 on
sem nenhuma regra também deva funcionar.