我在重写时遇到了麻烦。我以前从未真正使用过 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.css
REQUEST_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
没有任何规则也可以解决问题。