很多人資料說,last與break的區別在於,last並不會停止對下面location的匹配。我理解上模模糊糊。今天自己來測驗了一下。
rewrite 指令末尾的break應該與單獨寫break作用是不同的,比如:
if ($slow) {
limit_rate 10k;
break;
}
nginx對待rewrite中的break使用了單獨的程式碼處理去此命令。
測驗一下break與last的區別
location /test1.txt/ {
rewrite /test1.txt/ /test2.txt break;
}
location ~ test2.txt {
return 508;
}
使用break會停止匹配下面的location,直接發起請求www.xxx.com/test2.txt,由於不存在檔案test2.txt,則會直接顯示404。
使用last的話,會繼續搜尋下面是否有符合條件(符合重寫後的/test2.txt請求)的location。此時,/test2.txt剛好與面location的條件對應上了,進入花括號{}裡面的程式碼執行,這裡會返回508。
last,重寫後的規則,會繼續用重寫後的值去匹配下面的location。
break,重寫後的規則,不會去匹配下面的location。使用新的規則,直接發起一次http請求了。
一個直接進行一次http請求,一個繼續往下面匹配loction
在nginx的原始碼中處理break與last完全分成了不同的程式碼塊來處理:
if (ngx_strcmp(value[3].data, "last") == 0) {‘
last = 1;
....................
} else if (ngx_strcmp(value[3].data, "break") == 0) {
regex->break_cycle = 1;
last = 1;
....................
}
從上面看到是對陣列的第三個元素專門進行處理。
重寫程式碼"rewrite /2a.txt/ /2b.txt break;"中的break指令剛好是在第四(0開始數剛好是用3訪問)個位置處。
理解不準之處。歡迎指正。nginx是用c語言編寫的。熟悉c語言就容易看懂原始碼。我使用c語言少。以後要去補習一下。