apache url重写[L]真旗如何工作?

时间:2011-10-04 18:57:58

标签: php url-rewriting

我只是花了几个小时试图了解锄头[L]旗帜真的有效。 我阅读了文档,教程,但没有什么可以解释我的问题。

我有一个简单的.htaccess文件:

RewriteEngine On

RewriteRule ^ressources/(.+)$ App/ressources/$1 

RewriteCond %{REQUEST_FILENAME} -d [OR]
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^.*$ - [L]

RewriteRule ^(?!index.php)(.*)$ index.php?path=$1 [QSA]

它正常工作,除非用户请求不存在的资源文件,例如:ressources/notexist.css

所以,如果我去:

http://localhost/htaccessdir/ressources/css/dot-luv/jquery-ui-1.8.16.custom.css

这样可以获得css代码,因为该文件存在。

但如果我去:

http://localhost/htaccessDir/ressources/css/dot-luv/notexists.css

索引页面加载了路径值:

App/ressources/css/dot-luv/notexists.css/css/dot-luv/notexists.css

而不是:

App/ressources/css/dot-luv/notexists.css

这可以通过为第一条规则添加[L]标志来解决:

RewriteRule ^ressources/(.+)$ App/ressources/$1 [L]

我不明白为什么没有[L]标志就行不通。

有人可以解释我的行为吗?

由于

2 个答案:

答案 0 :(得分:1)

如果未设置L标志,则还将检查其余规则并应用最后一个匹配。 L代表 Last 并阻止进一步检查规则。

答案 1 :(得分:0)

mod_rewrite继续按照定义的顺序应用规则。只有当正则表达式匹配并且前面的重写匹配时,才会应用规则。如果您放置L标记,则不会应用其他规则(如果该规则为。

在您的情况下,应用第一条规则。下一个规则不是,因为cond不适用。然后应用最后一条规则。