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

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

我在重写时遇到了麻烦。我以前从未真正使用过 mod_rewrite,也没有太多使用正则表达式的经验。任何帮助都非常感谢!

<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 子目录中,但我一直遇到无限循环和服务器错误消息。我还没有找到任何有用的例子。我想这将是一个常见的重写...

提前致谢!

答案1

您的示例中的重写规则存在一些问题。首先,它并没有真正实现您想要的功能 - 您不需要位%{REQUEST_URI}。原始路径如/dir/css/theme.cssREQUEST_URI 将包含/dir/css/theme.css并且 $1 将包含css/theme.css(匹配(.*))导致最终 URL 为/dir/css/theme.css2009/css/theme.css。所以我们需要摆脱%{REQUEST_URI}留下以下 RewriteRule 的部分

^(.*)$ 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 目录中创建 .htacess 文件,这将阻止 Apache 使用父目录中的文件,例如RewriteEngine off。或者也许RewriteEngine on没有任何规则也可以解决问题。

相关内容