很多人資料說,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。
508是我随便設定的一個數字,反正隻是測驗而已。直接在螢幕上是看不到顯示的。在火狐的firebug中能夠看到資訊
在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;
從上面看到是對數組的第三個元素專門進行處理。
重寫代碼"rewrite /2a.txt/ /2b.txt break;"中的break指令剛好是在第四(0開始數剛好是用3通路)個位置處。
了解不準之處。歡迎指正。nginx是用c語言編寫的。熟悉c語言就容易看懂源碼。我使用c語言少。以後要去補習一下。