1

在我的一个项目中,我尝试使用 .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 内部服务器错误。

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

4

1 回答 1

5

ARewriteCond仅适用于其正下方的规则。换句话说,在您的示例中,它仅适用于空路径规则。向下移动RewriteCond一个档次,效果会更好。

RewriteRule ^$ public/ [L]

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

另外,我发现你的规则

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

奇怪。一个类似的 URL/adminsomething将被重写/admin/something,我认为这不是你想要的。

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

重定向的神奇关键字是R=301表示使用 http 代码 301 永久移动的重定向。例如,您可能想尝试...

# 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]
于 2012-04-12T13:44:29.673 回答