nginx系列之server_name定义与匹配规则
Server_name:定义与匹配规则
在Nginx中,server_name指令用于定义虚拟主机的域名(或IP地址)以及匹配规则。它决定了当某个请求到达Nginx时,应该由哪个虚拟主机来处理。server_name指令可以是一个域名、一个IP地址、以及一系列的通配符。
本文将详细介绍server_name的定义和匹配规则,并给出一些实例说明。
一、基本语法和含义
server_name指令的基本语法如下:
server_name name [];
其中,name表示域名、IP地址或通配符。name之间使用空格分隔。
当一个请求到达Nginx时,Nginx会将该请求的Host头域与每个虚拟主机的server_name指令进行匹配。如果
能够到一个匹配的虚拟主机,则将该请求交给该虚拟主机来处理。否则,Nginx会将该请求交给默认的虚拟主机来处理。正则匹配的含义
二、匹配规则
1. 精确匹配
预设情况下,server_name指令会进行精确匹配。即,只有当请求的Host头域与server_name完全一致时,才会进行匹配。
例如,我们有一个虚拟主机的server_name指令定义为:
server_name example;
那么,当请求的Host头域为example时,该虚拟主机将会被匹配到。而当请求的Host头域为
2. 通配符匹配
为了能够处理一些通用的情况,Nginx提供了一些通配符匹配的功能。
a) 通配符"*"
通过使用通配符"*",可以匹配任意子域名。例如:
server_name *.example;
当请求的Host头域为
b) 通配符"?"
通过使用通配符"?",可以匹配任意单个字符。例如:
server_name ?.example;
当请求的Host头域为x.example、y.example等等时,该虚拟主机将会被匹配到。而当请求的Host头域为example时,该虚拟主机将不会被匹配到。
c) 多层次通配符"."
通过使用多层次通配符".",可以匹配多个子域名。例如:
server_name .*example;
当请求的Host头域为
3. 正则表达式匹配
除了通配符匹配外,Nginx还支持使用正则表达式来进行匹配。
例如,我们可以使用正则表达式来匹配以"test"开头的域名:
server_name ~^test.*;
当请求的Host头域为ample、ample等等时,该虚拟主机将会被匹配到。
需要注意的是,正则表达式匹配是比较耗费资源的操作,在高并发的情况下可能会影响性能。因此,在配置中尽量避免大量使用正则表达式匹配。
三、server_name的优先级
当一个请求到达Nginx时,Nginx会按照以下顺序来匹配server_name:
1. 首先,Nginx会将请求的Host头域与每个虚拟主机的server_name进行精确匹配。如果匹配成功,则将该请求交给该虚拟主机来处理。
2. 如果没有精确匹配的虚拟主机,Nginx会将请求的Host头域与每个虚拟主机的server_name进行通配符匹配。通配符匹配的顺序是先匹配"*",再匹配"?",最后匹配多层次通配符"。"。
3. 如果没有通配符匹配的虚拟主机,Nginx会将请求的Host头域与每个虚拟主机的server_name进行正则表达式匹配。正则表达式匹配的顺序是按照配置中的顺序逐个匹配。
4. 如果还是没有匹配的虚拟主机,Nginx会将该请求交给默认的虚拟主机来处理。
需要注意的是,当有多个虚拟主机的server_name匹配成功时,Nginx会优先选择第一个匹配成功的虚拟主机来处理请求。
四、实例说明
下面通过几个实例来说明server_name的匹配规则。
实例1:
我们有两个虚拟主机的server_name指令分别定义为:
server_name example;
server_name *.example;
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论