摘要:先驗證第二條普通之間的匹配順序按最大前綴匹配配置普通普通測試鏈接,狀態(tài)碼為,符合預期。將正則的規(guī)則改下普通普通正則測試鏈接,狀態(tài)碼,匹配到,并且因為接下來沒有符合的正則,所以最終返回為,符合預期。
本文非完全原創(chuàng), 更多的是將相關資料進行整理
Last-Modified: 2019年5月10日15:28:29
參考鏈接linux Nginx配置篇:location的匹配規(guī)則(附測試驗證過程)
規(guī)則語法語法 | 匹配規(guī)則 |
---|---|
空 | 普通匹配(遵循最大前綴匹配規(guī)則, 優(yōu)先度比正則低) |
= | 精確(嚴格)匹配, 優(yōu)先度最高 后續(xù)不再匹配正則 |
^~ | 非正則匹配(依然遵循最大前綴匹配規(guī)則) 后續(xù)不再匹配正則 |
~ | 表示區(qū)分大小寫的正則匹配 |
~* | 表示不區(qū)分大小寫的正則匹配 |
/ | 通用匹配,任何請求都會匹配到(本質上等同于語法 空) |
!~ 和 !~* 分別為區(qū)分大小寫不匹配及不區(qū)分大小寫不匹配 的正則, 但是是用于條件判斷的時候(即 if 語句)
if ($host !~* "^www.") { # ... }
匹配簡單來說:
優(yōu)先匹配 = 精確匹配, 若未匹配到則轉下一步驟
依照最大前綴匹配規(guī)則, 先匹配普通規(guī)則(空 , ^~)
若最終匹配到 ^~, 則使用
若匹配到 空 或 未匹配到, 則轉下一步驟(當前匹配結果暫時保存)
按照物理存儲順序, 若匹配到任意一條正則, 馬上使用(無視后面正則)
若未匹配到任意正則, 則使用步驟2中匹配到普通正則
location 分類只有兩類:正則location和普通location
~ 和 ~* 為正則location
=、^~、@和無任何前綴的都屬于普通location,另外,@是用作服務端內部的一種轉發(fā)行為,很少用,在此不做討論。
先普通,再正則
普通location之間的匹配順序:按最大前綴匹配
如location /a/{},location /a/b/ {},請求 http://a/b/c.html 匹配的是 location /a/b/ {}
正則location之間的匹配順序:按配置文件中的物理順序匹配,只要匹配到一條正則,就不再考慮后面的
若普通location匹配到 精確匹配= 或 非正則匹配 ^~, 則不再進行后續(xù)的正則匹配
普通location與正則location之間的匹配結果選擇
普通location先匹配,匹配到了結果,只是一個臨時結果;
會繼續(xù)正則location的匹配,
如果匹配到正則,則用匹配到的正則結果;
如果沒有匹配到正則,則繼續(xù)用普通匹配的那個結果
綜上,常規(guī)的順序是匹配完普通location,還要繼續(xù)匹配正則location,但是,也可以告訴nginx,匹配到了普通location,就不要再搜索匹配正則location了,通過在普通location前面加上^~符號,^表示非,~表示正則,^~就是表示不要繼續(xù)匹配正則。
除了^~,=也可阻止nginx繼續(xù)匹配正則,區(qū)別在于^~依然遵循最大前綴匹配規(guī)則,而=是嚴格匹配
擴展 location / {}和 location =/ {}的區(qū)別/ {}作為普通匹配,是遵循最大前綴匹配原則的,所以,對于一個url,如果有更特殊合適的匹配,就選特殊合適的,如果沒有更特殊合適的匹配,也有 / {}兜著,就像是默認配置一樣
=/ {} 遵循的是嚴格匹配規(guī)則,只能匹配到 http://ip:port/,同時會停止搜索正則匹配。
測試接下來測試驗證。
1.先驗證第二條:普通location之間的匹配順序:按最大前綴匹配
nginx.conf配置:
#普通location location /a/b { return 666; } #普通location location /a/b/c { return 777; }
測試鏈接:http://192.168.88.38/a/b,http狀態(tài)碼為666,符合預期。如圖(后面的測試可自行F12打開瀏覽器控制臺查看http狀態(tài)碼,不再截圖):
測試鏈接:http://192.168.88.38/a/b/c,http狀態(tài)碼為777,匹配的是location /a/b/c {return 777;},符合預期。
2.驗證第三條:正則location之間的匹配順序:按配置文件中的物理順序匹配,只要匹配到一條正則,就不再考慮后面的
nginx.conf配置:
location ~* /a { return 999; } #匹配a-z的任意一個字母 location ~* ^/[a-z]$ { return 666; }
測試鏈接:http://192.168.88.38/a,http狀態(tài)碼999,匹配的是location ~* /a {renturn 999;},符合預期。
將nginx.conf中的兩個正則匹配順序調換下:
location ~* ^/[a-z]$ { return 666; } location ~* /a { return 999; }
測試鏈接:http://192.168.88.38/a,http狀態(tài)碼666,匹配的是location ~* ^/[a-z]$,符合預期。
3.驗證第4條,其實第4條就相當于是總結性的匹配順序了:
nginx.conf配置:
#普通location location /a { return 666; } #普通location location /a/b { return 777; } #正則location location ~* /a/b { return 888; }
測試鏈接:http://192.168.88.38/a,http狀態(tài)碼666,匹配到普通location,location /a {return 666;},符合預期。
測試鏈接:http://192.168.88.38/a/b,http狀態(tài)碼777,先進行普通location匹配,遵循最大前綴原則,匹配到location /a/b {return 777; },但是,這只是一個臨時結果,因為接下來還要繼續(xù)往下進行正則location匹配,匹配到 location ~* /a/b { return 888; },最終返回結果為888。符合預期。
將正則location的規(guī)則改下:
#普通location location /a { return 666; } #普通location location /a/b { return 777; } #正則location location ~* /a/c { return 888; }
測試鏈接:http://192.168.88.38/a/b,http狀態(tài)碼777,匹配到location /a/b {return 777; },并且因為接下來沒有符合的正則location,所以最終返回為777,符合預期。
綜上,location的匹配順序及結果取值都符合2,3,4點結論。
接下來再測試驗證普通location中的^~及=符號對于匹配搜索過程的阻斷效果,當然,別忘了這倆符號的真實作用。^~為普通字符匹配,=為精確匹配。
^~測試驗證nginx.conf配置:
location /a { return 666; } #普通匹配 location ^~ /a/b { return 777; } #正則location location ~* /a/b { return 888; }
測試鏈接:http://192.168.88.38/a/b,匹配到 location ^~ /a/b {return 777;}后,因為使用了^~符號,不再繼續(xù)搜索正則location匹配,所以,雖然下面有符合條件的正則location,但是最終還是返回了777,符合預期。
=測試驗證nginx.conf配置:
location /a { return 666; } #普通匹配 location = /a/b { return 777; } #正則location location ~* /a/b { return 888; }
測試鏈接:http://192.168.88.38/a/b,匹配到 location = /a/b {return 777;}后,因為使用了=符號,不再繼續(xù)搜索正則location匹配,最終返回777,符合預期。
另附上常用正則表達式:
. : 匹配除換行符外的任意字符
? : 重復0次或1次
: 重復1次或更多次
: 重復0次或更多次
d :匹配數字
^ : 匹配字符串的開始
$ : 匹配字符串的結束
{n} : 重復n次
{n,} : 重復n次或更多次
[c] : 匹配單個字符,如此處的字符 c
[a-z] : 匹配a-z小寫字母的任意一個
(a|b|c):匹配a或b或c
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/40429.html
摘要:然后檢查正則表達式,按照它們在配置文件中的顯示順序。正則表達式的搜索在第一個匹配中終止,并且使用相應的配置。正則表達式可以包含稍后可以在其他指令中使用的捕獲。 最近學習vuejs,做前后端分離,demo做完了,最終還是要發(fā)布的,于是學習nginx,其它配置倒是還好理解,唯獨對localtion理解不了,最后請教了一些網友,才得以解決問題,但是不希望下次還遇到問題,所以這里把localt...
摘要:本文同步在個人博客上,歡迎關注這篇文章整理了在前端開發(fā)中,在開發(fā)環(huán)境下使用重寫及代理功能的方法。表示該規(guī)則是使用正則定義的,區(qū)分大小寫。因此牢記在上下文中使用,而在上下文中使用。 本文同步在個人博客shymean.com上,歡迎關注 這篇文章整理了在前端開發(fā)中,在開發(fā)環(huán)境下使用nginx重寫uri及代理功能的方法。 參考 nginx中文文檔 前端開發(fā)者必備的 Nginx 知識 Ngin...
摘要:改為后,顯示出文件的大概大小,單位是或者或者默認為,顯示的文件時間為時間。 這是 Nginx 學習總結的第三篇,上一篇介紹到了 Nginx 學習總結(2) —— 基本配置,這一篇會對Location 模塊 做一些總結。我們知道,Location 模塊 主要是用于針對某些特定的 URL 進行配置,可以由前綴字符串定義,也可以由正則表達式定義。 Location 匹配規(guī)則 location...
摘要:作為一名,配置是我們必會的技能項之一。只有請求的路徑與后面的字符串完全相等時,才會命中。舉例表示該規(guī)則是使用正則定義的,區(qū)分大小寫。舉例匹配優(yōu)先級最后,我們了解下的查找規(guī)則。 作為一名PHPer,配置nginx是我們必會的技能項之一。但是當用戶請求到達nginx之后,是如何匹配到對應的配置項的呢? location語法規(guī)則 首先我們先了解下location的語法規(guī)則,location語...
摘要:首先,首先會檢查所有的前綴,從中選出最長前綴匹配也就是修飾符后面的路徑最長的的并記下。然后,如果存在正則時,按照其出現的順序,依次匹配,找到匹配的正則就不再繼續(xù)往下,并選擇該作為最終的結果。 場景: 在項目開發(fā)中經常會遇到nginx配置文件中,會有很多條location配置,卻讀不懂其中的含義而煩惱 Location是什么? Location是Nginx中的塊級指令(block dir...
閱讀 3881·2021-11-24 11:14
閱讀 3321·2021-11-22 13:53
閱讀 3883·2021-11-11 16:54
閱讀 1546·2021-10-13 09:49
閱讀 1211·2021-10-08 10:05
閱讀 3392·2021-09-22 15:57
閱讀 1754·2021-08-16 11:01
閱讀 965·2019-08-30 15:55