概述
nginx会根据虚拟主机,也就是server_name的值来处理请求。虚拟主机对应的是请求头的host字段的值。
也就是nginx会根据请求的端口,首先匹配listen中的值。
然后再根据请求中的host字段,匹配server_name中的值。
分几种情况详解下
1、只配置了一个server,该server中只有一个server_name,且值为域名
那只有该域名的访问才能成功。其他域名或者IP访问,都不会成功。
比如下面的配置:
server {
listen 80;
server_name test.com;
return 200 "xxx";
}
此时,只有test.com访问才能成功,其他访问都不行。
因为nginx中有一个默认的server_name,值是空的字符串。
当匹配不到默认或者指定server_name后,就会到这个server_name来处理。
可以理解是,在上面配置中,多了一个server_name的值(空字符)。
如下所示:
server {
listen 80;
server_name test.com "";
return 200 "xxx";
}
虽然上面说只能通过特定域名来访问,但服务器IP访问却是例外。
也就是说,用服务IP来访问,是能成功的。
如果想拒绝IP访问,那可以设置多一个server,其中server_name为空的字符串,并且return 444即可。
返回码444,是nginx特有的,非http标准的返回码,它可以用来关闭连接。
server {
listen 80;
server_name "";
return 444;
}
此时再通过服务器IP访问,就不会访问成功了。
2、只配置了一个server,该server中没有server_name
比如下面的配置:
server {
listen 80;
return 200 "xxx";
}
此时,不管是域名还是服务器IP的访问,都能成功。
正如上面提到的,nginx会有一个默认的server_name,值是空的字符串。
也就是不管请求头的host字段值是什么,都能匹配到该nginx。
3、多个server,但请求头没有host,则转发给默认虚拟主机处理
当有多个server的时候,默认第一个就是虚拟主机。
比如下面的配置:
server {
listen 80;
server_name test.com;
return 200 "xxx";
}
server {
listen 80;
server_name test.net;
return 200 "xxx";
}
此时,server_name=test.com就是默认的虚拟主机。
如果请求头的host没有匹配到任意一个server_name,或者请求中没有host字段,那nginx就会把请求,转发到对应端口的默认虚拟主机。
注意,我们也可以通过添加default_server,来显示的设置默认虚拟主机。
这个default_server是在listen后面设置的,而不是server_name。
server {
listen 80;
server_name test.com;
return 200 "xxx";
}
server {
listen 80 default_server;
server_name test.net;
return 200 "xxx";
}
此时,默认虚拟主机是test.net,而不是test.com。
4、"server_name _"指的是无效的域名
server_name的值设置成 _ ,指的不是什么特别的名字,它只是一个无效的域名。
也就是不会匹配到任何真实的域名。
一般用来处理非法或者无效的域名请求。
比如上面提到类似的,拒绝非法访问,可以通过下面配置来设置:
server {
listen 80;
server_name _;
return 444;
}
最后
如果觉得文章还可以,请点赞或在看,谢谢。
有任何问题都可以留言咨询。