在nginx 模块处理请求之前,我们首先要确保它的指令被正确的解析出来,为了处理这个请求,到底使用哪个指令的值,因为指令的配置可以出现在http 下,也可以出现在server 块下,也可以出现在location 块下,在这里,我们首先必须确保请求是被哪一个server 块处理 . 下面介绍server_name ,它可以保证我们在处理11个阶段的http 模块处理之前,先决定哪个server块指令被使用。
server_name 指令 后面可以跟三种域名
1、跟一个明确的域名
指令后可以跟多个域名,第一个是主域名,下面是一个控制主域名用法的配置,默认为off
Syntax server_name_in_redirect on | off ;
Default server_name_in_redirect off;
Context http,server,location
下面演示一下
新建一个 servername_test.conf
server {
server_name primary.zk02.com second.zk02.com;
server_name_in_redirect off;
return 302 /redirect;
}
然后在nginx.conf 使用include 引入
include /soft/nginx/conf/example_conf/servername_test.conf;
使用nginx -s reload 重载配置文件.
使用curl 访问
[root@zk02 ~]# curl second.zk02.com -I
HTTP/1.1 302 Moved Temporarily
Server: nginx/1.16.1
Date: Tue, 28 Jan 2020 22:28:15 GMT
Content-Type: text/html
Content-Length: 145
Location: http://second.zk02.com/redirect
Connection: keep-alive
可以看到访问路径为 Location: http://second.zk02.com/redirect
更改 server_name_in_redirect on;
重新加载配置文件
[root@zk02 ~]# curl second.zk02.com -I
HTTP/1.1 302 Moved Temporarily
Server: nginx/1.16.1
Date: Tue, 28 Jan 2020 22:30:01 GMT
Content-Type: text/html
Content-Length: 145
Location: http://primary.zk02.com/redirect
Connection: keep-alive
可以看到访问路径为第一个域名.
2、* 泛域名 : 仅支持在最前或最后加*
例如:
server_name *.zk02.com
3、正则表达式:加 ~ 前缀
例如:
server_name www.zk02.com ~^www\d+\.zk02$;
用正则表达式创建变量:用小括号()
例如:
server {
server_name ~^(www\.)?(.+)$;
location / {root /sites/$2}
}
其中$2 指取 上面正则表达式中第二个变量的值. 如: 如果值为www.zk02.com , 则$2 的值为zk02.com
再比如说,使用命名变量的方式 ,使用问号和尖括号的方式,如?<domain>
server {
server_name ~^(www\.)?(?<domain>.+)$;
location / {root /sites/$domain ;}
}
其他
- .zk02.com 可以匹配 zk02.com *.zk02.com
- _ 匹配所有
- ”” 匹配没有传递Host 头部.
server 的匹配顺序
1、精确匹配
2、* 在前的泛域名
3、*在后的泛域名
4、按文件中的顺序匹配正则表达式域名
5、default server
- 第一个
- listen 指定default