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