nginx中的break與last指令區別

weixin_34054866發表於2013-10-03



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

 

 

 

相關文章