虚拟服务器根据名称(指HTTP请求头中的Host字段)是指HTTP请求头中的主机来确定客户的请求将被处理来自哪台服务器。
让我们从一个简单的设置开始。 下面配置了三个虚拟服务器,全部监听80端口:
在上面的配置中,nginx仅测试“Host”请求头字段来确定请求应该路由到哪台服务器。 如果“Host”的值与任何服务器名称都不匹配,或者请求根本不包含“Host”标头字段,nginx会将请求路由到该端口的默认服务器。
在上面的配置中,默认服务器是第一个-这是nginx的标准默认行为。 您还可以在Listen指令中使用default_server参数来显式定义哪个服务器应该是默认服务器:
如果不允许在没有en-“Host”标头的情况下处理客户端请求(在另一个另一方面,仅处理带有Host标头的客户端请求)客户端请求字段),您可以定义一个仅拒绝请求的服务器:
这里,server_name定义在空字符串上,它将匹配不带“Host”的查询。 头字段并返回一个特殊的标准nginx代码444来关闭连接。
让我们看一个更复杂的设置,其中一些虚拟服务器侦听不同的地址:
在上面的设置中,nginx首先根据服务器块侦听器指令测试请求的IP地址。 和港口。 然后,它根据服务器块中对应于IP地址和端口的server_name条目来测试请求的“Host”标头字段。 如果未找到服务器名称,则请求将由默认服务器处理。 例如,在端口192.168.1.1:80上收到的对www.example.com的请求将由端口192.168.1.1:80上的默认服务器处理,也就是说由第一台服务器处理,因为它没有www.example.com为此端口定义。
前面说过,默认服务器是监听端口的一个属性,不同的端口可以设置不同的默认服务器:
现在我们看看nginx是如何选择查询位置的处理简单、典型的PHP站点:
无论指定的顺序如何,nginx首先搜索文字字符串给出的最具体的前缀位置。 在上面的配置中,唯一的前缀位置是“/”,并且由于它匹配任何查询,因此它将被用作最后的手段。 然后nginx按照配置文件中指定的顺序检查正则表达式给出的位置。 第一个匹配的表达式会停止搜索,nginx将使用该位置。 如果没有正则表达式与查询匹配,nginx将使用之前找到的最具体的前缀位置。
注意:所有位置类型仅测试不带参数的查询行的URI部分。 这是因为查询字符串参数可以通过多种方式给出,例如:
此外,任何人都可以查询查询字符串中的任何内容:
现在让我们看看如何在上面的配置: