测试环境
- Nginx 1.10.3 (nginx version: nginx/1.10.3 (Ubuntu))
- Ubuntu 16.04.4 LTS x64 (ip:192.168.241.132)
- Chrome (Win10)
- Win10 Host
|
1
2
3
4
|
# host文件内容192.168.241.132 www.ExactName.com192.168.241.132 www.Wildcard.com192.168.241.132 www.RegEx.com |
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
# Nginx 测试html文件目录/var/www/├── test-1│ ├── ExactName.html│ ├── ExactNameOther.html│ ├── ExactName-RE.html│ └── ExactName-WildCard.html├── test-2│ ├── LongestWildcard.html│ ├── ShorterWildcard.html│ ├── Wildcard-End.html│ └── Wildcard-Reg.html├── test-3│ ├── LongestWildcard-End.html│ ├── ShorterWildcard-End.html│ └── Wildcard-Reg.html└── test-4 ├── RegEx-exacted.html └── RegEx.html |
匹配优先级
- 精确匹配名称
- 以星号开头的最长通配符
- 以星号结尾的最长通配符
- 第一个匹配的正则表达式(按配置文件中出现的顺序)
实例
1.精确名称
优先级最高,无论先后位置
文件目录
- 配置文件内容
|
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
|
# 不包含正则表达式的不匹配的名称网址server { listen 80; server_name www.ExactNameOther.com; root /var/www/test-1/; index ExactNameOther.html;}# 包含正则表达式,并且正则表达式能匹配上,在确切名称配置前面server { listen 80; server_name ~^www\.Ex*+\.com$; root /var/www/test-1/; index ExactName-RE.html;}# 包含通配符,并且能匹配上网址,在确切名称配置前面server{ listen 80; server_name *.ExactName.com www.ExactName.*; root /var/www/test-1/; index ExactName-WildCard.html;}# 确切名称的网址server { listen 80; server_name www.ExactName.com; root /var/www/test-1/; index ExactName.html;} |
结果
2.以星号开头的最长通配符
同样能匹配的几条规则中,最长前缀的匹配的上,即使位置在后面
文件目录
- 配置文件内容
|
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
|
# 同样能匹配输入网址www.Wildcard.com,较少确切的字符个数,但在前面server { listen 80; server_name *.com; root /var/www/test-2/; index ShorterWildcard.html;}# 同样能匹配输入网址www.Wildcard.com, 星号结尾,但在前面server { listen 80; server_name www.Wildcard.*; root /var/www/test-2/; index Wildcard-End.html;}# 同样能匹配输入网址www.Wildcard.com,正则表达式,但在前面server { listen 80; server_name ~^.*\.Wildcard.com$; root /var/www/test-2/; index Wildcard-Reg.html;}# 同样能匹配输入网址www.Wildcard.com,但是确切的字符个数更长server { listen 80; server_name *.Wildcard.com; root /var/www/test-2/; index LongestWildcard.html;} |
结果
3.以星号结尾的最长通配符
同样能匹配的几条规则中,最长前缀的匹配的上,即使位置在后面
文件目录
- 配置文件内容
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
# 同样能匹配输入网址www.Wildcard.com,较少确切的字符个数server { listen 80; server_name www.*; root /var/www/test-3/; index ShorterWildcard-End.html;}# 同样能匹配输入网址www.Wildcard.com,正则表达式,但在前面server { listen 80; server_name ~^.*\.Wildcard.com$; root /var/www/test-2/; index Wildcard-Reg.html;}# 同样能匹配输入网址www.Wildcard.com,但是确切的字符个数更长server { listen 80; server_name *.Wildcard.com; root /var/www/test-3/; index LongestWildcard-End.html;} |
结果
4.第一个匹配的正则表达式(按配置文件中出现的顺序)
无论确切字符个数的多少,最先加载的配置优先
- 配置文件内容
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
# 同为能匹配上的正则表达式,确切的字符个数较少,但在前面server { listen 80; server_name ~^.*.com$; root /var/www/test-4/; index RegEx.html;}# 同为能匹配上的正则表达式,确切的字符个数多,但在后面server { listen 80; server_name ~^.*RegEx.com$; root /var/www/test-4/; index RegEx-exacted.html;} |
结果
总结
1.所有规则分配到各自类,优先级如下,找到第一个符合的类别即停止
2.在符合的类别中搜索所有符合的规则,并按各自类别优先级规则处理
类别2. 以星号开头的最长通配符
类别3. 以星号结尾的最长通配符
类别4. 第一个匹配的正则表达式(按配置文件中出现的顺序)
如果有相同配置,Nginx会给出警告,但仍能启动, 会选择最先找到规则
|
1
2
3
4
5
6
7
8
9
10
11
|
# 以下仅给出ExactName示范, 通配符和正则表达式也适用server { listen 80; server_name same.name.com; .......}server { listen 80; server_name same.name.com; .......} |
以上为个人经验,希望能给大家一个参考





