2

我正在尝试在 中使用该[L]标志RewriteRule,但它似乎不起作用。如果您调用该页面,我希望这样:

www.domain.com/admin/

它会将您重定向到:

www.domain.com/backend.php

否则,如果您调用任何其他页面(某些页面除外),它会重定向到:

www.domain.com/index.php

这是我到目前为止所拥有的:

RewriteEngine on

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

RewriteCond $1 !^(index\.php|admin|assets|images|uploads|robots\.txt)
RewriteRule ^(.*)$ /index.php/$1 [L]

如果我只使用第一条规则,它可以工作(但显然不会将其他页面重定向到 index.php)。如果我添加第二条规则,服务器似乎忽略了第一条规则(我认为它被第二条规则“覆盖”,即使我添加了[L]标志)

4

2 回答 2

2

这不是L工作方式。重写引擎将不断循环遍历所有规则,直到进入引擎的 URI 与出来的​​ URI 相同。L只是告诉重写引擎停止在当前循环迭代中应用规则。所以说你有:

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

在 1 次迭代后,给定 URI /blah,我得到,/foo/blah因为它在第一条规则之后停止重写(但仍将继续循环)。如果我删除L

RewriteRule ^(.*)$ /foo/$1
RewriteRule ^(.*)$ /bar/$1

1 次迭代后,给定 URI /blah,我得到/bar/foo/blah. 两个规则都被应用,一个接一个,因为L没有阻止它。

您需要在第二个规则中添加一个条件以防止它重写第一个规则,其中任何一个都可以:

RewriteCond $1 !^(backend\.php|index\.php|admin|assets|images|uploads|robots\.txt)
RewriteRule ^(.*)$ /index.php/$1 [L]

或者:

RewriteCond %{ENV:REDIRECT_STATUS} !200
RewriteCond $1 !^(index\.php|admin|assets|images|uploads|robots\.txt)
RewriteRule ^(.*)$ /index.php/$1 [L]
于 2012-09-07T14:40:25.777 回答
0

你的第二条规则很奇怪。我不知道您通过将$1您检查条件的值作为值来尝试做什么。它应该看起来像这样:

RewriteEngine on

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

RewriteCond %{REQUEST_FILENAME} !^(index\.php|admin|assets|images|uploads|robots\.txt|backend\.php)
RewriteRule ^(.*)$ /index.php/$1 [L]

注意我还为backend.php

于 2012-09-07T14:28:28.350 回答