在学习Apache重写Rewrite功能的时候。不知道 flags中的L到底是做什么的比如下面的代码:
RewriteRule ^(.*) first.php?key=$1 [L] RewriteRule ^(.*) second.php?key=$1
既然不想执行下面的代码,直接注释和删除不就好了吗。为什么非要用L
从你的配置文件看,确实后面那句是没必要的。但是这仅仅限于你所给到的配置示例。并不代表L没用,L还是有它自己的应用场景的
L
假设
RewriteRule /([0-9]+).html /test1.php?id=$1 RewriteRule /(.*) /test2.php?id=$1
这个配置,我的请求是123.html, 那么在请求到达apache的时候,apache会从上到下开始匹配规则:第一步, 匹配RewriteRule /([0-9]+).html /test1.php?id=$1, 发现匹配通过, 因为没有标记停止,所以继续向下执行代码第二步,匹配RewriteRule /(.*) /test2.php?id=$1, 发现匹配通过,因为是最后一条规则,且是通过的规则,则最终请求被导向test2.php?id=123.html的页面
RewriteRule /([0-9]+).html /test1.php?id=$1
RewriteRule /(.*) /test2.php?id=$1
test2.php?id=123.html
但是,如果是这样:
RewriteRule /([0-9]+).html /test1.php?id=$1 [L] RewriteRule /(.*) /test2.php?id=$1
在第一条匹配通过之后,发现有标记L,则apache停止向下继续匹配,而是直接就导向了test1.php?id=123的页面; 而其他的请求(比如:abc.html)只有当第一条规则不通过的时候,才会继续匹配第二条规则, 请求被导向至test2.php?id=abc.html
test1.php?id=123
test2.php?id=abc.html
从你的配置文件看,确实后面那句是没必要的。但是这仅仅限于你所给到的配置示例。并不代表
L
没用,L
还是有它自己的应用场景的假设
这个配置,我的请求是123.html, 那么在请求到达apache的时候,apache会从上到下开始匹配规则:
第一步, 匹配
RewriteRule /([0-9]+).html /test1.php?id=$1
, 发现匹配通过, 因为没有标记停止,所以继续向下执行代码第二步,匹配
RewriteRule /(.*) /test2.php?id=$1
, 发现匹配通过,因为是最后一条规则,且是通过的规则,则最终请求被导向test2.php?id=123.html
的页面但是,如果是这样:
在第一条匹配通过之后,发现有标记
L
,则apache停止向下继续匹配,而是直接就导向了test1.php?id=123
的页面; 而其他的请求(比如:abc.html)只有当第一条规则不通过的时候,才会继续匹配第二条规则, 请求被导向至test2.php?id=abc.html