测试环境
- 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
# host文件内容 192.168.241.132 www.exactname.com 192.168.241.132 www.wildcard.com 192.168.241.132 www.regex.com
# 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.精确名称
优先级最高,无论先后位置
文件目录
- 配置文件内容
# 不包含正则表达式的不匹配的名称网址
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.以星号开头的最长通配符
同样能匹配的几条规则中,最长前缀的匹配的上,即使位置在后面
文件目录
- 配置文件内容
# 同样能匹配输入网址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.以星号结尾的最长通配符
同样能匹配的几条规则中,最长前缀的匹配的上,即使位置在后面
文件目录
- 配置文件内容
# 同样能匹配输入网址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.第一个匹配的正则表达式(按配置文件中出现的顺序)
无论确切字符个数的多少,最先加载的配置优先
- 配置文件内容
# 同为能匹配上的正则表达式,确切的字符个数较少,但在前面
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会给出警告,但仍能启动, 会选择最先找到规则
# 以下仅给出exactname示范, 通配符和正则表达式也适用
server {
listen 80;
server_name same.name.com;
.......
}
server {
listen 80;
server_name same.name.com;
.......
}
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论