最稳妥的子域名匹配方式是前缀通配符*.example.com,仅匹配一级子域如www、api;不匹配根域或二级子域;通配符须位于最左点前且唯一;多通配符按后缀长度最长匹配;精确匹配优先于通配符;正则适用于二级子域等复杂场景但性能较低。

用 server_name 匹配子域名,最常用也最稳妥的方式是前缀通配符 *.example.com,它能匹配所有一级子域名,比如 www.example.com、api.example.com、shop.example.com,但不匹配 example.com(根域)或 dev.test.example.com(二级子域)。
只支持左端单星号,写法有严格限制
通配符只能出现在最左边一个点的前面,且整个表达式中只能有一个 *:
- ✅ 合法:
*.example.com(匹配一级子域) - ❌ 非法:
www.*.com(中间带星号) - ❌ 非法:
*.test.example.com(虽语法不报错,但实际不匹配二级子域;Nginx 不支持跨层级通配) - ❌ 非法:
example.*(右通配符在多数版本中不被原生支持,行为不可靠)
多个通配符共存时,按“最长匹配”生效
如果同时配置了多个前缀通配符,Nginx 会选与请求 Host 最贴合的那个:
- 配置了
*.example.com和*.api.example.com - 当请求 Host 是
backend.api.example.com→ 命中*.api.example.com - 当请求 Host 是
www.example.com→ 命中*.example.com
注意:这个“最长”指域名后缀长度,不是配置顺序。谁的后缀更长(即更具体),谁优先。
通配符永远低于精确匹配,无法覆盖根域
即使你写了 *.example.com,只要同时存在 server_name example.com;,访问 example.com 就一定走精确匹配那一块,不会落到通配符里。
- 想让根域和子域共用一套配置?直接把它们都列在同一个
server_name行里:server_name example.com www.example.com api.example.com *.example.com; - 这样既覆盖明确域名,又兜住其他一级子域,逻辑清晰、无歧义。
正则可补足通配符做不到的事,但要慎用
如果你真需要匹配二级子域(如 dev.test.example.com)或提取子域名做后续处理,就得用正则:
- 必须以
~或~*开头,且整个表达式建议加引号:server_name ~^([a-z0-9.-]+)\.example\.com$; - 支持命名捕获,方便复用:
server_name ~^(?<sub>.+)\.example\.com$;</sub>,之后可用$sub引用 - 性能开销明显高于通配符,仅在必要时启用


















