Nginx泛解析需用server_name配合通配符(如.example.com或.example.com)匹配子域名,且DNS须配置通配符A记录;匹配优先级为精确>通配符,应将泛解析块置于末尾并显式包含主域名。

用通配符配置 Nginx 泛解析虚拟主机,核心是正确使用 server_name 指令配合星号(*)或正则表达式,让一个 server 块响应多个子域名请求。关键不在于“支持所有子域名”这个结果,而在于匹配逻辑是否符合预期、是否与其他 server 块冲突。
通配符域名的写法与匹配规则
Nginx 对通配符有明确限制:只允许在开头或结尾使用 *,且不能同时出现在两端。常见合法写法包括:
-
server_name *.example.com;→ 匹配www.example.com、api.example.com,但不匹配example.com(主域名)或sub.api.example.com -
server_name example.com *.example.com;→ 同时覆盖主域名和所有一级子域名 -
server_name .example.com;→ 这是 Nginx 特殊语法,等价于*.example.com加example.com,更简洁可靠
泛解析必须配合 DNS A 记录或 CNAME
仅配置 Nginx 不足以实现泛解析,DNS 层需确保所有子域名都指向该服务器 IP:
- 在 DNS 控制台添加一条通配符记录:
*.example.com. IN A 192.168.1.100 - 若使用云服务商(如阿里云、Cloudflare),选择“主机记录”填
*,“记录值”填服务器公网 IP - 验证方式:执行
dig test1.example.com +short和dig test2.example.com +short,应返回相同 IP
避免匹配冲突的配置顺序
Nginx 按配置文件中 server 块出现顺序进行匹配,但优先级由匹配精度决定。通配符容易被更精确的规则覆盖:
- 如果同时存在
server_name www.example.com;和server_name *.example.com;,访问www.example.com会命中前者(精确匹配优先) - 若想让某个子域名走独立配置,把它放在通配符块之前;若想统一处理,把通配符块放最后,并确保没有更宽泛的正则干扰
- 建议显式写出主域名:
server_name example.com *.example.com;,避免遗漏
实际可用的泛解析 server 配置示例
以下是一个兼顾健壮性与可维护性的典型配置:
server {
listen 80;
server_name example.com *.example.com;
root /var/www/portal;
index index.html;
location / {
try_files $uri $uri/ /index.html;
}
# 可选:根据 $host 动态设置 root 或转发
# set $app_name $host;
# rewrite ^/(.*)$ /app/$app_name/$1 break;
}


















