nginx 中可通过 server_name *.example.com 实现一级泛域名匹配,或用正则 ~^.*\.example\.com$ 支持多级子域名;需配合 dns 泛解析记录及 hosts 测试,并注意安全兜底与 https 证书覆盖范围。

在 Nginx 中配置泛解析(wildcard domain)虚拟主机,本质是让一个 server 块响应匹配某类子域名的请求,比如 *.example.com 或 example.*。Nginx 本身不支持正则式通配符(如 server_name ~^.*\.example\.com$;)作为默认匹配方式,但可通过标准语法和合理组合实现泛解析效果。
用星号 * 配置一级泛域名(推荐)
这是最常用、最稳妥的方式:匹配任意一级子域名,前提是 DNS 已将所有子域名解析到该服务器 IP。
-
server_name *.example.com;—— 匹配www.example.com、api.example.com、dev.example.com,但不匹配example.com(主域名)或a.b.example.com(二级子域名) - 若需同时匹配主域名,显式列出:
server_name example.com *.example.com; - Nginx 按顺序匹配
server_name,精确匹配优先于通配符,所以把example.com放前面更安全
用正则表达式实现灵活泛匹配
当需要覆盖多级子域名(如 a.b.example.com)或复杂规则时,使用正则表达式:
- 语法以波浪线开头:
server_name ~^(?<sub>.+)\.example\.com$;</sub> - 注意:必须启用 PCRE 支持(默认已编译),且正则匹配性能略低于普通匹配
- 可结合
map指令提取子域名用于后续逻辑,例如设置不同根目录:root /var/www/$sub; - 务必加
^和$边界符,避免意外匹配(如notexample.com)
配合 DNS 和本地 hosts 测试泛解析
配置生效前,确保请求能真正到达 Nginx:
- DNS 层面:在域名服务商处添加一条泛解析记录,如
* IN A 192.168.1.100(指向你的服务器 IP) - 开发测试:Windows/macOS 编辑
/etc/hosts或C:\Windows\System32\drivers\etc\hosts,添加:127.0.0.1 test.example.com demo.example.com - 验证是否命中:在配置中加入临时日志,或用
curl -H "Host: xyz.example.com" http://your-server-ip手动构造 Host 头测试
注意事项与常见陷阱
泛解析容易引发意外交互或安全风险,需主动规避:
- 不要仅靠泛解析承接所有流量——建议为明确子域名单独建
server块,泛解析块放在最后作兜底 - 避免
server_name "";或空值,这会匹配任意 Host,可能被滥用 - HTTPS 场景下,泛域名证书(如
*.example.com)只覆盖一级子域名,不覆盖主域名;如需两者,证书应包含example.com和*.example.com - 若用 nginx-proxy(Docker 场景),泛解析通过
VIRTUAL_HOST=*.example.com即可自动生效,无需手动写 server 块











