apache url重写[L]真正标志是如何工作的


apache url rewriting how does [L] really flag works?

我刚刚花了几个小时试图理解[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]标志就不能工作。

谁能给我解释一下它的行为?

谢谢

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

mod_rewrite保持按照规则定义的顺序应用规则。只有当regexp匹配并且前面的rewritecsecond匹配时,才会应用规则。如果您设置了L标志,则不会应用任何其他规则,如果该规则是。

在您的例子中,应用了第一条规则。下一条规则就不适用了,因为这条规则不适用。然后应用最后一条规则