在學習Apache重寫Rewrite功能的時候。不知道 flags中的L到底是做什麼的例如下面的程式碼:
RewriteRule ^(.*) first.php?key= [L] RewriteRule ^(.*) second.php?key=
既然不想執行下面的程式碼,直接註解和刪除不就好了嗎。為什麼要用L
從你的設定檔看,確實後面那句是沒必要的。但這僅限於你所給予的設定範例。不代表L没用,L還是有它自己的應用場景的
L
假設
RewriteRule /([0-9]+).html /test1.php?id= RewriteRule /(.*) /test2.php?id=
這個配置,我的請求是123.html, 那麼在請求到達apache的時候,apache會從上到下開始匹配規則:第一步, 匹配RewriteRule /([0-9]+). html /test1.php?id=$1, 發現匹配通過, 因為沒有標記停止,所以繼續向下執行程式碼RewriteRule /([0-9]+).html /test1.php?id=, 发现匹配通过, 因为没有标记停止,所以继续向下执行代码第二步,匹配RewriteRule /(.*) /test2.php?id=, 发现匹配通过,因为是最后一条规则,且是通过的规则,则最终请求被导向test2.php?id=123.html第二步,匹配RewriteRule /(.*) /test2.php?id =$1, 發現匹配通過,因為是最後一條規則,且是通過的規則,則最終請求被導向test2.php?id=123.html的頁面
RewriteRule /([0-9]+). html /test1.php?id=$1
RewriteRule /([0-9]+).html /test1.php?id=
RewriteRule /(.*) /test2.php?id=
test2.php?id=123.html
RewriteRule /(.*) /test2.php?id =$1
但是,如果是這樣:
RewriteRule /([0-9]+).html /test1.php?id= [L] RewriteRule /(.*) /test2.php?id=
在第一條配對通過之後,發現有標記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 /([0-9]+).html /test1.php?id=
, 发现匹配通过, 因为没有标记停止,所以继续向下执行代码第二步,匹配
RewriteRule /(.*) /test2.php?id=
, 发现匹配通过,因为是最后一条规则,且是通过的规则,则最终请求被导向test2.php?id=123.html
第二步,匹配RewriteRule /(.*) /test2.php?id =$1
, 發現匹配通過,因為是最後一條規則,且是通過的規則,則最終請求被導向test2.php?id=123.html
的頁面但是,如果是這樣:
在第一條配對通過之後,發現有標記
L
,则apache停止向下继续匹配,而是直接就导向了test1.php?id=123
的页面; 而其他的请求(比如:abc.html)只有当第一条规则不通过的时候,才会继续匹配第二条规则, 请求被导向至test2.php?id=abc.html