# server\_name

指令<mark style="color:blue;">**server\_name**</mark>用于配置主机名称，这里的“主机”，就是指此server块对外提供的虚拟主机。**设置了主机的名称并配置好DNS，用户就可以使用这个名称向此虚拟主机发送请求了**。

指令**server\_name**的语法结构为：

```nginx
server_name name ...;
```

{% hint style="info" %} <mark style="color:blue;">**主机可以只有一个名称，也可以有多个名称，名称之间由空格隔开**</mark>。每个名称就是一个**域名**，由**两段**或者**三段**组成，之间由点号“.”隔开。下面是一个简单的示例：

```nginx
server_name myserver.com www.myserver.com;
```

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

{% hint style="info" %} <mark style="color:blue;">**在name 中可以使用通配符“\*”**</mark>，但**通配符只能用在由三段字符串组成的名称的首段或尾段**，或者**由两段字符串组成的名称的尾段**，如：&#x20;

```nginx
server_name *.myserver.com www.myserver.*;
```

{% endhint %}

{% hint style="info" %} <mark style="color:blue;">**在name中还可以使用正则表达式，并使用波浪号“\~”作为正则表达式字符串的开始标记**</mark>，如：

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

在该例中，此虚拟主机的名称设置使用了正则表达式（使用“\~”标记），正则表达式的含义是：

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

{% hint style="info" %}
从Nginx-0.7.40开始，name中的正则表达式支持<mark style="color:blue;">**字符串捕获**</mark>功能，即**可以将正则表达式匹配成功的名称中的一部分字符串拾取出来，放在固定的变量中供下文使用**。

<mark style="color:blue;">**拾取的标识为一对完整的小括号“()”且后面不紧跟其他的正则表达式字符，括号中的内容就是被拾取的内容**</mark>。一个正则表达式中可以存在多对不嵌套的小括号，这些内容会从左到右依次存放在变&#x91CF;**$1**、**$2**、**$3**……中。这些变量的有效区域不超出本server块。
{% endhint %}
{% endhint %}

{% hint style="warning" %}
由于server\_name指令支持使用通配符和正则表达式两种配置名称的方式，因此<mark style="color:orange;">**在包含有多个虚拟主机的配置文件中，可能会出现一个名称被多个虚拟主机的server\_name匹配成功**</mark>。那么，来自这个名称的请求到底要交给哪个虚拟主机处理呢？Nginx服务器做出如下规定：

* 对于<mark style="color:blue;">**匹配方式不同**</mark>的，按照以下的优先级选择虚拟主机，排在前面的优先处理请求。
  1. **准确匹配server\_name**
  2. **通配符在开始时**匹配server\_name成功
  3. **通配符在结尾时**匹配server\_name成功
  4. **正则表达式**匹配server\_name成功
* 在以上四种匹配方式中，如果server\_name被处于同一优先级的匹配方式多次匹配成功，则<mark style="color:blue;">**首次匹配**</mark>成功的虚拟主机处理请求。
  {% endhint %}

{% hint style="info" %}
server\_name通过<mark style="color:blue;">**与客户端请求中的Host头进行匹配**</mark>，从而从多个server块中选择匹配的虚拟主机进行请求转发。
{% endhint %}
