*.example.com仅匹配一级子域名(如blog.example.com),不匹配根域example.com或二级子域staging.blog.example.com;优先级仅次于精确匹配,多个前导通配符时选最长者。

以通配符开头的域名,比如 *.example.com,在 Nginx 中属于“前导通配符匹配”,它专门用于匹配**任意一级子域名**,但不匹配根域本身(example.com)或二级及以上子域(如 dev.test.example.com)。
匹配规则很明确
只要 Host 请求头是形如 www.example.com、api.example.com、shop.example.com 这样的格式,就会命中 server_name *.example.com;。Nginx 内部会把 * 视为一个完整的 DNS 标签(label),只替换最左边那一段。
-
*.example.com✅ 匹配blog.example.com、test.example.com -
*.example.com❌ 不匹配example.com(缺子域) -
*.example.com❌ 不匹配staging.blog.example.com(两层子域) -
*.example.com❌ 不匹配www.*.com(中间带星号非法)
优先级高于后缀通配符和正则
前导通配符的匹配优先级排第二,仅次于精确匹配:
- 第一:精确匹配(如
server_name www.example.com;) - 第二:
*.example.com这类前导通配符(最长匹配原则) - 第三:正则表达式(
~^...),且多个正则时按配置顺序取第一个成功匹配
所以即使你把 *.example.com 写在配置文件靠后位置,只要请求是 api.example.com,而你又没写更具体的精确匹配(比如 api.example.com),它就一定会被这个通配符捕获。
多个前导通配符共存时怎么选
如果有多个前导通配符,Nginx 会选“最长”的那个:
*.api.example.com*.example.com
当请求是 backend.api.example.com 时,会命中第一个——因为 *.api.example.com 的长度(18 字符)大于 *.example.com(14 字符),它更具体。
实际配置建议
推荐和精确域名写在同一行,清晰又无歧义:
server_name example.com www.example.com *.example.com;
这样既覆盖了根域、常用 www 别名,也兜住其他一级子域。注意:这行里所有项都是独立参与匹配的,example.com 和 *.example.com 并不冲突,只是前者优先级更高而已。


















