虚拟主机 server_name 优先级
测试环境
- 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;
.......
}