在 nginx 中配置通配符与泛域名,需要在 server_name 指令中使用星号(*)作为占位符。通配符支持前缀匹配(如 *.example.com)和后缀匹配(如 mail.*),而精确匹配的域名优先级高于通配符。通过合理组合这些规则,nginx 能够根据请求的 host 头将流量分发到不同的虚拟主机。

通配符前缀与后缀的具体用法是什么
通配符 *.example.com 用于匹配所有二级子域名,而 mail.* 用于匹配以 mail 开头的任意顶级域名。这两种模式是 Nginx 处理非精确域名匹配的核心机制,允许服务器响应一系列相关的域名请求。

server {
listen 80;
server_name *.example.com;
root /var/www/example;
}
server {
listen 80;
server_name mail.*;
root /var/www/mail;
}
当访问 www.example.com 时,请求会被第一个 server 块处理,因为 *.example.com 匹配该域名。当访问 mail.google.com 时,请求会被第二个 server 块处理,因为 mail.* 匹配该域名。注意,通配符不能出现在域名的中间部分,只能位于最左侧或最右侧。
精确域名与通配符的优先级如何确定
Nginx 在处理 server_name 时遵循严格的优先级顺序:精确匹配最高,其次是通配符前缀匹配,最后是通配符后缀匹配。如果多个规则同时匹配,Nginx 会选择优先级最高的那个 server 块来处理请求。这种机制确保了特定域名的配置不会被通用的通配符配置意外覆盖。

server {
listen 80;
server_name example.com www.example.com;
root /var/www/specific;
}
server {
listen 80;
server_name *.example.com;
root /var/www/wildcard;
}
在上述配置中,如果请求的 Host 是 example.com,Nginx 会优先选择第一个 server 块,因为它是精确匹配。如果请求的 Host 是 blog.example.com,由于没有精确匹配的规则,Nginx 会选择第二个 server 块,即通配符前缀匹配。这种优先级机制对于管理复杂的域名结构非常关键,确保关键域名始终指向正确的根目录或后端服务。
如果请求的域名不匹配任何 server_name 会返回什么
如果客户端请求的 Host 头不匹配任何配置的 server_name,Nginx 会将请求路由到该监听端口(listen)对应的默认服务器块。这个默认服务器块通常由第一个定义的 server 块充当,或者可以通过 default_server 参数显式指定。这意味着未匹配的请求仍然会得到响应,而不是直接断开连接或返回错误,除非默认服务器块配置了特定的错误处理逻辑。


















