我刚刚花了几个小时试图理解[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
标志,则不会应用任何其他规则,如果该规则是。
在您的例子中,应用了第一条规则。下一条规则就不适用了,因为这条规则不适用。然后应用最后一条规则