nginx-serverName

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 确切的server_name匹配
server {
listen 80;
server_name example.org www.example.org;
}

# 以*通配符开始的最长字符串
server {
listen 80;
server_name *.example.org;
}

# 以*通配符结束的最长字符串
server {
listen 80;
server_name mail.*;
}

# 匹配正则表达式
server {
listen 80;
server_name ~^(?<user>.+)\.example\.net$;
}

nginx将按照以下顺序对server_name进行匹配,和配置文件中的出现顺序无关

  1. 确切的名字
  2. 以星号开头的最长通配符名称
  3. 最长的通配符名称以星号结尾
  4. 第一个匹配正则表达式(按配置文件中的出现顺序

注:只要有一项匹配以后就会停止搜索


通配符

  • 通配符名称只可以在名称的起始处或结尾处包含一个星号,并且星号与其他字符之间用点分隔
  • www.*.example.orgw*.example.org都是非法的,请使用~^www\..+\.example\.org$~^w.*\.example\.org$代替


正则表达式

  • 为了使用正则表达式,虚拟主机名必须以波浪线~起始否则该名字会被认为是个确切的名字
  • 如果表达式含星号,则会被认为是个通配符名称
  • 不要忘记设置“^”和“$”锚点, 语法上它们不是必须的,但是逻辑上是的
  • 域名中的点.需要用反斜线\转义。含有{}的正则表达式需要被引用
1
server_name  "~^(?<name>\w\d{1,3}+)\.example\.net$";


命名的正则表达式捕获组在后面可以作为变量使用

1
2
3
4
5
6
server {
server_name ~^(www\.)?(?<domain>.+)$;
location / {
root /sites/$domain;
}
}

PCRE使用下面语法支持命名捕获组:

?<name> 从PCRE-7.0开始支持,兼容Perl 5.10语法
?'name' 从PCRE-7.0开始支持,兼容Perl 5.10语法
?P<name> 从PCRE-4.0开始支持,兼容Python语法


或者

1
2
3
4
5
6
server {
server_name ~^(www\.)?(.+)$;
location / {
root /sites/$2;
}
}


杂项名称

空:""

如果服务器块中未定义server_name,则nginx使用空名称作为服务器名称

1
2
3
4
server {
listen 80;
server_name example.org www.example.org "";
}
下划线:_
1
2
3
4
5
6
7
server {
listen 80 default_server;
server_name _;
return 444;
}
# 这个名称没什么特别之处,它只是无数域名之一,永远不会与任何真实姓名相交
# 使用"--"、"!@#"效果也是一样
default_server
1
2
3
4
5
6
7
8
9
10
11
12
13
14
http {
server {
listen 80;
server_name www.a.com;
}

# 显示的定义一个 default server
server {
listen 80 default_server;
server_name _;
return 403; # 403 forbidden
}

}
1
2
3
4
5
6
7
8
9
10
11
12
13
http {
# 如果没有显式声明 default server 则第一个 server 会被隐式的设为 default server
server {
listen 80;
server_name _; # _ 并不是重点
return 403; # 403 forbidden
}

server {
listen 80;
server_name www.a.com;
}
}