nginx配置中location匹配規則詳解


一、概述

nginx官方文檔給出location語法如下:

1
location [=|~|~*|^~] uri { … }

其中,方括號中的四種標識符是可選項,用來改變請求字符串和uri的匹配方式。uri是待匹配的請求字符串,可以是不包含正則的字符串,這種模式被稱為“標准的uri";也可以包含正則,這種模式被稱為"正則uri",如下:

1
2
location ~ .*\.(php|php5)?$ {
}

二、四種可選的標識符

標識符 描述
= 精確匹配;用於標准uri前,要求請求字符串和uri嚴格匹配。如果匹配成功,就停止匹配,立即執行該location里面的請求。
~ 正則匹配;用於正則uri前,表示uri里面包含正則,並且區分大小寫。
~* 正則匹配;用於正則uri前,表示uri里面包含正則,不區分大小寫。
^~ 非正則匹配;用於標准uri前,nginx服務器匹配到前綴最多的uri后就結束,該模式匹配成功后,不會使用正則匹配。
普通匹配(最長字符匹配);與location順序無關,是按照匹配的長短來取匹配結果。若完全匹配,就停止匹配。

備注:

1、如果uri里面包含正則表達式,就必須使用~或~*標識符;

2、針對~和~*匹配標識符,可以在前面加上!來取反,如下:

!~ 表示正則不匹配,區分大小寫。

!~* 表示正則不匹配,不區分大小寫。

2.1 “=”精准匹配案例

1
2
3
location  = /login {
   # 精確匹配 /login ,匹配成功后,立即結束
}

2.2 “~”區分大小寫正則匹配案例

1
2
3
location ~ /images/ {
   #正則匹配,區分大小寫,匹配成功后,立即結束
}

2.3 “~*”不區分大小寫正則匹配案例

 

1
2
3
location ~* /images/ {
   #正則匹配,不區分大小寫,匹配成功后,立即結束
}

2.4 “^~” 不進行正則匹配的標准匹配

1
2
3
location ^~ /images/ {
   # 匹配任何以 /images/ 開頭的地址,匹配符合以后,停止往下搜索正則,采用這一條。
}

 

2.5 普通匹配(最長字符匹配)

1
2
3
4
location  /blog/ {
   # 與location順序無關
   # 若完全匹配成功,就不在繼續匹配,否則還會進行正則匹配
}

三、location匹配順序

在沒有標識符的請求下,匹配規則如下:

1、nginx服務器首先在server塊的多個location塊中搜索是否有標准的uri和請求字符串匹配。如果有多個標准uri可以匹配,就匹配其中匹配度最高的一個location。

2、然后,nginx在使用location塊中,正則uri和請求字符串,進行匹配。如果正則匹配成功,則結束匹配,並使用這個location處理請求;如果正則匹配失敗,則使用標准uri中,匹配度最高的location。

備注:

1、如果有精確匹配,會先進行精確匹配,匹配成功,立刻返回結果。

2、普通匹配與順序無關,因為按照匹配的長短來取匹配結果。

3、正則匹配與順序有關,因為是從上往下匹配。(首先匹配,就結束解析過程)

4、在location中,有一種統配的location,所有的請求,都可以匹配,如下:

1
2
3
4
location  / {
   # 因為所有的地址都以 / 開頭,所以這條規則將匹配到所有請求
   # 但是正則和最長字符串會優先匹配
}

結合標識符,匹配順序如下:

(location =) > (location 完整路徑) > (location ^~ 路徑) > (location ~,~* 正則順序) > (location 部分起始路徑) > (location /)

(精確匹配)> (最長字符串匹配,但完全匹配) >(非正則匹配)>(正則匹配)>(最長字符串匹配,不完全匹配)>(location通配)

五、案例

假設,現有如下一些規則:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
location = / {  
    //精確匹配/ ,主機名后面不能帶任何字符串
     echo  "規則A" ;
}
 
location = /login {
   //精確匹配 /login 開頭的地址,匹配符合以后,不在繼續往下搜索 
     echo  "規則B" ;
}
 
location ^~ /blog/ { 
   //非正則匹配,匹配/blog/后,停止往下搜索正則,采用這一條
   echo  "規則C" ;
}
 
 
location ~  \.(gif|jpg|png|js|css)$ {
     //區分大小寫的正則匹配  若匹配成功,停止往下搜索正則,采用這一條
     echo  "規則D" ;
}
 
 
location ~* \.png$ {  
    //區分大小寫的正則匹配 ,停止往下搜索正則,采用這一條
     echo  "規則E" ;
}
 
location / {
   //因為所有的地址都以 / 開頭,所以這條規則將匹配到所有請求
   //如果沒任何規則匹配上,就采用這條規則
     echo  "規則F" ;
}
 
location /blog/detail { 
   //最長字符串匹配,若完全匹配成功,就不在繼續匹配,否則還會進行正則匹配
   echo  "規則G" ;
}
 
location /images {  
     //最長字符串匹配,同上 
     echo  "規則Y" ;
}
 
location ^~ / static /files {  
     //非正則匹配,若匹配成功,就不在繼續匹配
     echo  "規則X" ;
}

1、當訪問根路徑/的時候,比如http://www.findme.wang/ ,會匹配規則A。

2、當訪如http://www.findme.wang/login ,會匹配規則B。

3、當訪如http://www.findme.wang/login.html ,會匹配規則F。

4、當訪如http://www.findme.wang/blog/detail/3.html ,會匹配規則C。分析思路,首先看看,“精確匹配”是否可以匹配成功,顯示不可以;然后,看看是否可以“普通匹配”是否可以完全匹配,顯示也沒有;接着在看看非正則匹配,是否可以匹配成功,發現同規則C匹配上了,所以采用了規則C。


免責聲明!

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



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