天天看點

nginx中的break與last指令差別

很多人資料說,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語言少。以後要去補習一下。

繼續閱讀