.htaccess重定向异常

时间:2012-04-12 13:26:19

标签: .htaccess redirect

在我的一个项目中,我正在尝试使用.htaccess重定向。我正在使用这样的重定向:

RewriteRule ^$ public/ [L]
RewriteRule (.*) public/$1 [L]

但是,现在我想为重写规则添加一个例外。我希望http://example.com/admin/以相同的方式重定向,只能重定向到另一个目录。所有其他流量仍应转到公共目录。所以我添加了这样的重写条件:

RewriteCond %{REQUEST_URI} !/admin/
RewriteRule ^$ public/ [L]
RewriteRule (.*) public/$1 [L]

这没有做到这一点。我仍然被重定向到公用文件夹。我也试过这个:

RewriteRule ^admin$ admin/ [L]
RewriteRule admin(.*) admin/$1 [L]

RewriteCond %{REQUEST_URI} !/admin
RewriteRule ^$ public/ [L]
RewriteRule (.*) public/$1 [L]

这只会让事情变得更糟。我现在得到500内部服务器错误。

我现在已经搜索了几个小时,而且我已经厌倦了找到如何为某个文件夹添加例外的示例,但是没有显示如何将此流量重定向到另一个文件夹。你能告诉我我做错了什么,或者我可以尝试哪种其他方法?

1 个答案:

答案 0 :(得分:5)

RewriteCond仅适用于其下方的规则。换句话说,在您的示例中,它仅适用于空路径规则。将RewriteCond向下移动一个等级,它会更好。

RewriteRule ^$ public/ [L]

RewriteCond %{REQUEST_URI} !/admin/
RewriteRule (.*) public/$1 [L]

此外,我找到了你的规则

RewriteRule admin(.*) admin/$1 [L]

是奇怪的。像/adminsomething这样的网址会被重写为/admin/something,我认为这不是你想要的。

此外,我预感到您将重写重定向混淆。重写是一种规则,可以在内部重写请求并以不同方式进行解释。重定向是一种规则,它会告诉访问者的浏览器转到不同的地址。你要去哪一个?

重定向的magic关键字是R=301,这意味着重定向http代码301 Moved Permanently。例如,您可能想尝试...

# This first rule is actually redundant in this case so skip it...
#RewriteRule ^$ public/ [R=301,L]
RewriteCond %{REQUEST_URI} !/admin
RewriteRule (.*) public/$1 [R=301,L]