nginx通配符泛域名需显式声明根域名,如server_name example.com .example.com;仅支持.example.com或www.*形式,不匹配子子域或中间通配,https需san证书,并通过nginx -t和curl验证。

Linux 下用 Nginx 配置通配符泛域名,核心是正确使用 server_name *.example.com 这类语法,并注意它不自动包含根域名——这是最容易出错的地方。
通配符的基本写法和限制
通配符只支持两种形式:星号在最前(*.example.com)或在最后(www.*),不能出现在中间,也不能连用(如 *.sub.*.com 无效)。
-
server_name *.example.com;匹配blog.example.com、api.example.com,但不匹配example.com或dev.blog.example.com -
server_name www.*;匹配www.org、www.net,适合多后缀站点,但要注意 DNS 解析是否到位 - 每个通配符只能覆盖一个域名段,
*不代表“任意长度字符串”,而是“一个未指定的完整标签”
必须搭配根域名显式声明
泛域名配置不会自动兜底主域名,*.example.com 和 example.com 是两个独立匹配项。如果希望两者共用同一站点,得明确写在一起:
server_name example.com *.example.com;
- 空格分隔,不是逗号,也不是换行
- 顺序不影响匹配优先级(Nginx 内部按精确 > 通配符排序),但建议把精确的放前面,便于人眼阅读
- 若需 HTTPS,证书必须同时包含
example.com和*.example.com(即 SAN 证书或泛域名证书)
常见踩坑与验证方法
配置完别急着 reload,先检查是否真生效:
- 运行
nginx -t确保语法无误;再用nginx -T | grep "server_name"查看最终加载的值 - 用
curl -H "Host: test.example.com" http://127.0.0.1和curl -H "Host: example.com" http://127.0.0.1分别测试,观察是否进入同一个 server 块 - 如果返回 404 或进错站点,大概率是:漏写了
listen 80、server_name拼错、或者没加根域名那一行
进阶:结合正则做更精细控制
通配符不够用时(比如要排除某些子域),可加正则兜底,但注意匹配顺序:
- 先写精确匹配:
server_name example.com www.example.com; - 再写通配符:
server_name *.example.com; - 最后用正则收口:
server_name ~^([a-z]+)\.example\.com$;(匹配纯字母子域) - Nginx 一旦匹配上前面的通配符,就不会继续往后看正则——所以正则适合放在最后作补充,而不是替代通配符











