KernelRanch
返回文章列表

子域与泛解析:什么时候该开 `*` 记录

2026-11-10 #域名

一个域用久了,子域会自然长出来:blog 给博客、api 给接口、img 给图片、staging 给测试。管理这些名字有两种方式,一条条加记录,或者开一条 * 全接住。选错的代价不小:泛解析开得太随意,任何拼错的子域都会打到你的源站;该开的时候不开,每次加服务都要改 DNS。读完这篇,你能按用途判断该用哪种。

子域最终都要落到记录上,类型选择见 50-dns-records-tutorial.md;如果子域要挂到 Workers 或 Pages,路由配置见 55-workers-routes-custom-domain.md。

1. 子域只是记录名前缀

blog.example.com 之所以存在,是因为 DNS 里有一条名字为 blog 的记录。没有记录的子域就是不存在,查询返回 NXDOMAIN 或 NODATA。

规划上建议先定几类固定角色,再考虑泛解析:

子域用途记录类型
www主站别名CNAME 到根域,或 A
api接口入口A / AAAA,通常开代理
img、static静态资源CNAME 到对象存储或 Pages
staging、dev测试环境A,通常不开代理
mail邮件客户端入口A,仅 DNS

命名上避开下划线(_ 在主机名里非法,只有 _dmarc、_acme-challenge 这类特殊记录才用),也别用太长的一串,证书和日志里都不好看。

2. 泛解析的匹配规则

一条 * 记录可以接住所有"没有单独定义"的子域。本机查到的两组对照很能说明问题:

查询结果含义
zz9q-random-test-1234.github.io A185.199.108.153、185.199.109.153、185.199.110.153、185.199.111.153存在 * 记录,任意子域都解析
zz9q-random-test-1234.cloudflare.com A只返回 SOA,没有 A没有 * 记录,该子域不存在

github.io 是典型的泛解析用法:每个用户拿一个 username.github.io,平台不可能为每个用户预建记录,只能靠 * 接住。cloudflare.com 没开泛解析,所以随便编个子域查不到东西。

规则上有三点要记住:

* 只匹配一级。*.example.com 能匹配 a.example.com,匹配不到 a.b.example.com,后者需要单独一条 *.b.example.com。

显式记录优先。同时存在 blog 和 * 时,blog.example.com 用 blog 那条,* 只兜底没定义的名字。

* 不匹配根域。example.com 本身不受 * 影响,根域记录要单独加。

3. 泛解析适合什么

多租户场景是它的主场:每个客户一个子域(acme.yourapp.com),用户注册后立刻可用,不用等 DNS 生效,也不用调 API 建记录。这类系统里,* 指向一个统一入口,应用层按 Host 头分流。

另一个场景是短链、图床这类"名字无限多"的服务,* 加 Workers 路由就能把所有子域收进同一个 Worker 处理。

不适合的场景同样明确:企业内部服务、按环境划分的子域、需要独立证书的子域。这些名字数量有限且要精确控制,一条条加反而清楚。

4. 泛解析的三个副作用

第一是错误被掩盖。开了 * 之后,拼错的子域也会解析成功,api.exmaple.com 一样能打开,排查时看不到 NXDOMAIN 这种明确信号。

第二是垃圾子域。任何 xxx.example.com 都能访问,攻击者可以用你的域做钓鱼落地页、发垃圾内容的跳转,搜索引擎也可能收录一堆无意义子域。应对办法是在应用层校验 Host,不在白名单里的直接返回 404。

第三是证书覆盖范围。Cloudflare 免费版的 Universal SSL 覆盖根域与一级通配符 *.example.com,再深的 a.b.example.com 不在覆盖内,需要单独申请证书或上 Advanced Certificate Manager。开泛解析之前先确认证书能覆盖到你要用的层级。

5. 在 Cloudflare 上的写法

泛解析记录的名字栏填 *,类型选 A 或 CNAME,值填源站或上游域名。开代理的话,所有匹配到的子域都会走边缘,WAF、缓存、日志对这些子域统一生效。

Workers 路由可以写成 *.example.com/*,把泛解析子域的请求全部交给一个 Worker。这个组合在短链、图床类项目里很常见,具体做法见 97-project-url-shortener.md。

验证方式:

Resolve-DnsName -Name anything.example.com -Type A
Resolve-DnsName -Name deep.anything.example.com -Type A

第二条如果查不到,说明只开了一级泛解析,符合预期。

常见问题

泛解析能不能匹配二级子域?

不能,* 只吃一级标签。需要多级时给每一级单独加 *,或者用 NS 把整个子域委派出去。

为什么加了 * 之后 www 还是旧地址?

显式记录的优先级高于 *,www 有自己的记录时 * 不参与。想统一走泛解析,得先删掉 www 那条。

泛解析会影响收信吗?

MX 查询不看 * 的 A 记录,但 mail.example.com 如果有 A 记录被 * 接住,客户端可能连到错误的地址。给邮件入口单独加显式记录。

小结

子域规划的本质是"名字由谁决定":由你决定,就一条条加记录,控制精确;由用户决定,就开泛解析,把分流交给应用层。两种方式的运维成本完全不同,混用要有明确边界。

泛解析不是省事开关,它把 DNS 层的校验让给了应用层。开了 * 就要在代码里做 Host 白名单,否则拼写错误和恶意子域都会变成你的问题。多域名的重定向策略见 94-multi-domain-redirect.md。

数据来源与检索时间

检索时间 2026-11-10。通配符对照查询为本机实跑。

来源URL对应数据
Cloudflare DNS 记录类型https://developers.cloudflare.com/dns/manage-dns-records/reference/record-types/* 泛解析记录的写法与匹配范围
Cloudflare 通配符 DNS 说明https://developers.cloudflare.com/dns/manage-dns-records/how-to/wildcard-dns-records/泛解析只匹配一级、与显式记录的优先级
Cloudflare Universal SSLhttps://developers.cloudflare.com/ssl/edge-certificates/universal-ssl/免费证书覆盖根域与一级通配符
Workers 路由https://developers.cloudflare.com/workers/configuration/routing/routes/*.example.com/* 路由写法

核验说明

  • 实查:随机子域 zz9q-random-test-1234.github.io 的 A 记录返回 4 个 185.199.x.153 地址,证明 github.io 存在泛解析;随机子域 zz9q-random-test-1234.cloudflare.com 只返回 SOA、无 A 记录,证明该域未开泛解析。
  • 依据文档:* 只匹配一级、显式记录优先、Universal SSL 的覆盖层级、Workers 通配路由写法,均来自 Cloudflare 官方文档,未做实测。
  • 未执行:创建泛解析记录、删改 www 记录、绑定 Workers 通配路由,本机无 Zone 权限,全部未落地。文中"二级子域查不到"的验证命令未在自有域上跑过。