mod_rewrite似乎忽略了[L]标志

时间:2012-09-07 14:22:09

标签: apache mod-rewrite

我正在尝试使用[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]标志)

2 个答案:

答案 0 :(得分: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]

答案 1 :(得分: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

的传递