在我的一个项目中,我正在尝试使用.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内部服务器错误。
我现在已经搜索了几个小时,而且我已经厌倦了找到如何为某个文件夹添加例外的示例,但是没有显示如何将此流量重定向到另一个文件夹。你能告诉我我做错了什么,或者我可以尝试哪种其他方法?
答案 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]