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。