最常用且推荐的方式是使用前缀通配符*.example.com,它匹配所有一级子域名(如www、api),不匹配根域或二级以上子域;通配符仅允许在最左端点出现,必须写为*.example.com,不可加引号或置于中间。

在 Nginx 中,用 server_name 匹配多个二级域名,最常用且推荐的方式是使用前缀通配符 *.example.com。它能精准覆盖所有一级子域名(如 www.example.com、api.example.com、shop.example.com),但不匹配根域 example.com 或多级子域(如 dev.test.example.com)。
只允许左端通配,写法必须规范
通配符 * 只能出现在域名最左侧,且紧邻点号,格式为 *.example.com。其他写法均无效:
-
www.*.com→ ❌ 中间带星号,语法错误 -
example.*→ ❌ 后缀通配不被原生支持,会被当作字面量或报错 -
*.ex*.com→ ❌ 多个星号或非端点位置,Nginx 拒绝加载 -
"*.example.com"→ ❌ 引号会破坏解析,server_name 不接受引号包裹
匹配范围与常见误区
*.example.com 实际匹配的是“以任意单段字符开头 + 点号 + example.com” 的 Host 请求:
- ✅ 匹配:
www.example.com、blog.example.com、test.example.com - ❌ 不匹配:
example.com(无子域)、dev.test.example.com(二级子域)、EXAMPLE.COM(大小写不影响匹配,Nginx 内部统一转小写)
注意:即使你把 *.example.com 写在配置最前面,只要请求是 www.example.com 且你同时定义了 server_name www.example.com;,Nginx 仍会优先选精确匹配——匹配逻辑看类型优先级,不看书写顺序。
需要覆盖根域 + 所有子域?分条写更可靠
若希望 example.com 和所有一级子域共用同一套配置,不要依赖通配符兜底,而是显式并列声明:
server_name example.com *.example.com;
这样既明确又安全。Nginx 会按“精确匹配 > 通配符”的规则自动选择最优项:访问 example.com 走精确项,访问 api.example.com 走通配项。
进阶:用正则实现更灵活的二级域名控制
当需要区分子域名内容(比如提取子域名为路径)、跳转特定子域、或匹配含数字/下划线的复杂命名时,正则更合适:
- 启用捕获组:
server_name ~^(?[a-z0-9\-]+)\.example\.com$; - 后续可用
$sub引用匹配到的子域名,例如:root /var/www/$sub;或rewrite ^/(.*)$ /$sub/$1 break; - 注意必须以
~(区分大小写)或~*(忽略大小写)开头,且.要转义为\.
正则性能略低,仅在通配符无法满足需求时使用;务必配合 nginx -t 验证语法,并用 curl -H "Host: test.example.com" http://127.0.0.1 实测路由是否正确。











