nginx

关注公众号 jb51net

关闭
首页 > 网站技巧 > 服务器 > nginx > Nginx虚拟主机server_name优先级

Nginx配置之虚拟主机server_name优先级方式

作者:LeoForBest

本文主要介绍了Nginx配置文件中不同匹配规则的优先,包括精确匹配、以星号开头的最长通配符、以星号结尾的最长通配符以及第一个正则表达式匹配,总结了Nginx处理匹配规则的优先机制,以及注意事项

测试环境

# 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. 精确匹配名称
  2. 以星号开头的最长通配符
  3. 以星号结尾的最长通配符
  4. 第一个匹配的正则表达式(按配置文件中出现的顺序)

实例

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;
    .......
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文