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。

 

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語言少。以后要去補習一下。

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM