server_name

指令server_name用于配置主机名称,这里的“主机”,就是指此server块对外提供的虚拟主机。设置了主机的名称并配置好DNS,用户就可以使用这个名称向此虚拟主机发送请求了

指令server_name的语法结构为:

server_name name ...;

主机可以只有一个名称,也可以有多个名称,名称之间由空格隔开。每个名称就是一个域名,由两段或者三段组成,之间由点号“.”隔开。下面是一个简单的示例:

server_name myserver.com www.myserver.com;

在该例中,此虚拟主机的名称设置为myserver.com或www.myserver.com。Nginx服务器规定,第一个名称作为此虚拟主机的主要名称。

在name 中可以使用通配符“*”,但通配符只能用在由三段字符串组成的名称的首段或尾段,或者由两段字符串组成的名称的尾段,如:

server_name *.myserver.com www.myserver.*;

在name中还可以使用正则表达式,并使用波浪号“~”作为正则表达式字符串的开始标记,如:

server_name ~^www\d+\.myserver\.com$;

在该例中,此虚拟主机的名称设置使用了正则表达式(使用“~”标记),正则表达式的含义是:

以www开头(使用“^”标记),紧跟一个或多个0~9的数字(“\d+”的含义,其中,“\d”代表0~9的某一个数字,“+”代表之前的一个字符出现一次或者多次),再紧跟.myserver.co(由于“.”在正则表达式中有特殊含义,因此需要使用“\”进行转义),最后以m结束(由“$”标记)。

从Nginx-0.7.40开始,name中的正则表达式支持字符串捕获功能,即可以将正则表达式匹配成功的名称中的一部分字符串拾取出来,放在固定的变量中供下文使用

拾取的标识为一对完整的小括号“()”且后面不紧跟其他的正则表达式字符,括号中的内容就是被拾取的内容。一个正则表达式中可以存在多对不嵌套的小括号,这些内容会从左到右依次存放在变量$1$2$3……中。这些变量的有效区域不超出本server块。

由于server_name指令支持使用通配符和正则表达式两种配置名称的方式,因此在包含有多个虚拟主机的配置文件中,可能会出现一个名称被多个虚拟主机的server_name匹配成功。那么,来自这个名称的请求到底要交给哪个虚拟主机处理呢?Nginx服务器做出如下规定:

  • 对于匹配方式不同的,按照以下的优先级选择虚拟主机,排在前面的优先处理请求。

    1. 准确匹配server_name

    2. 通配符在开始时匹配server_name成功

    3. 通配符在结尾时匹配server_name成功

    4. 正则表达式匹配server_name成功

  • 在以上四种匹配方式中,如果server_name被处于同一优先级的匹配方式多次匹配成功,则首次匹配成功的虚拟主机处理请求。

server_name通过与客户端请求中的Host头进行匹配,从而从多个server块中选择匹配的虚拟主机进行请求转发。

Last updated