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

我在重写时遇到了麻烦。 我从来没有真正使用过mod_rewrite,没有太多的正则expression式的经验。 任何帮助表示赞赏!

<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> 

这部分工作, http://www.site.com/dir/被路由到http://www.site.com/dir/2009/,但像http://www.site.com/dir/css /theme.css失败。 我希望重写所有到父目录的请求到2009子目录,但我一直遇到无限循环和服务器错误消息。 我还没有find有用的例子。 我想这将是一个共同的改写…

提前致谢!

在你的例子中重写规则有几个问题。 首先,它并不真正做你想做的 – 你不需要%{REQUEST_URI}位。 使用/dir/css/theme.css这样的原始path,REQUEST_URI将包含/dir/css/theme.css 1将包含css/theme.css (匹配(.*) ),导致最终的URL为/dir/css/theme.css2009/css/theme.css 。 所以我们需要摆脱下面的RewriteRule留给我们的%{REQUEST_URI}部分

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

这将把/dir/css/theme.css翻译成/dir/2009/css/theme.css

但是这个规则还有一个问题,因为它会造成无限的嵌套,因为(。*)会匹配任何URL。 那么会发生什么呢?第一步我们的示例URL被重写为/dir/2009/css/theme.css 。 而且由于新的URL /dir/2009/css/theme.css符合我们的规则,它将会被重新写入,然后再一次…

所以基本上我们需要一些防止重写已经被重写的URL的东西。 所以如果URL已经包含了/dir/2009我们希望Apache保持独立。 一种方法是将以下条件添加到重写规则中

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

与最终的.htaccess文件是这样的

 <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> 

另一种方法是在dir / 2009目录中创build.htacess文件,这将阻止Apache使用类似于RewriteEngine off的父目录中的文件。 或者也许没有任何规则的RewriteEngine on应该这样做。