概述

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


最后

如果觉得文章还可以,请点赞或在看,谢谢。

有任何问题都可以留言咨询。

作者 灰武士