主题
Cloudflare Pages(把域名指到 xxx.pages.dev)
在 Cloudflare Pages 上做了个站,想把这里的二级域名挂上去。这一页讲清楚每一步该点哪里, 以及三条路各自的要求。
先理解 Cloudflare 的两条规则
Cloudflare 官方文档把自定义域名分成两种,要求完全不同:
| 你要挂的域名 | Cloudflare 的要求 |
|---|---|
顶点域名(可注册域,例如 example.com) | 必须把这个域加到 Cloudflare 当 zone(也就是把 NS 改成 Cloudflare 的) |
子域名(例如 shop.example.com) | 不用交给 Cloudflare,加一条 CNAME 指向 <你的项目>.pages.dev 就行 |
麻烦就出在这里:app.9k.beer 因为 9k.beer 还没进公共后缀列表(PSL),Cloudflare 把它当 子域名看待,于是要一条 CNAME;可它同时是我们托管 zone 的顶点,而 DNS 规定顶点不能放 CNAME。而顶点放 CNAME,平台会替你实现(后台用合成记录回答 CNAME 查询)。
顺序很重要
先在 Cloudflare 项目里把这个域名加进去,再来配 DNS。 Cloudflare 文档写得很明确:只手动加记录、却没在 Pages 后台关联域名的话, 域名会解析不到、浏览器报 522。
三条路,先选一条
| 你的目标 | 走哪条 | 最终能打开的地址 |
|---|---|---|
想让 app.9k.beer 本身打开 Pages 站 | 步骤 A(顶点 CNAME) | https://app.9k.beer |
| 只求能用、最保险 | 步骤 B(www + CNAME) | https://www.app.9k.beer |
| 想让整个域名都归 Cloudflare 管 | 步骤 C(委派 NS) | 两条都能用 |
步骤 A:在顶点加一条 CNAME
先说结论:绑 Cloudflare Pages 请优先走步骤 B
这条(顶点这条路我们还没能在 Cloudflare 这边跑通) 顶点这个名字在我们平台上是一个独立 zone 的顶点,Cloudflare 会把这种名字当成 "apex 域名"处理,而它对 apex 域名的要求是"该域名本身得是 Cloudflare 的 zone" —— 所以顶点 CNAME 在它这里常常卡在「停用」。 步骤 B(www 那一层 + CNAME)是实测能通的,见下一节。
先在 Cloudflare 里加域名。 进 Cloudflare Dashboard → Workers & Pages → 选你的项目 → Custom domains → Set up a domain → 填完整域名
app.9k.beer→ Continue。 这时它多半显示待验证 / pending,先不用管,接着做第 2 步。回本平台加一条 CNAME。 「我的域名」 → 点开
app.9k.beer→ 「新增记录」,这样填:字段 填什么 名称 @(表示域名本身;留空也一样)—— 不要写app,那会建到app.app.9k.beer类型 CNAME内容 <你的项目>.pages.dev—— 完整域名,别带https://TTL 默认 3600验证记录写对了没有。 直接问权威服务器,跳过缓存:
bashdig @ns1.hapdns.com app.9k.beer A +short应该返回 Cloudflare 的地址,和这条命令的结果一致:
bashdig <你的项目>.pages.dev A +short等 Cloudflare 那边变 Active(它要读的 CNAME 这会儿已经能读到了), 然后打开
https://app.9k.beer。
步骤 B:用 www 那一层 + CNAME(实测通过)
这条路我们实测通了:加完之后 Cloudflare 的 Custom domains 里会显示 活动 / SSL 已启用,https://www.app.9k.beer 能直接打开(2026-09-21 实测)。
原因也不难理解:www 那一层不是独立 zone 的顶点,所以在 Cloudflare 眼里它就是 一条普通子域记录,它去读那条 CNAME 就能读到。
- Cloudflare 的 Set up a domain 里改填
www.app.9k.beer,把它作为自定义域名加进项目; - 本平台新增记录:名称
www、类型CNAME、内容<你的项目>.pages.dev; - 验证:
dig @ns1.hapdns.com www.app.9k.beer CNAME +short应显示<你的项目>.pages.dev.; - 用
https://www.app.9k.beer访问。
想把 app.9k.beer 和 www.app.9k.beer 都挂上,就把两个都加进项目的 Custom domains, 各自按上面的方式配好 DNS。
为什么 A 和 B 结果不一样:顶点 CNAME 在我们这边是合成的(顶点同时挂 ALIAS + LUA, 对外和真 CNAME 一致),DNS 层面完全正确;但 Cloudflare 对"顶点"另有一套要求 (见步骤 A 的提醒),所以它的校验会卡。B 那条不是顶点,一次就过。
B 那条路在 2026-09-21 之前是唯一的办法(当时顶点只能靠委派给别家 DNS)。 现在 A 就够了,除非你想要
www那个地址。
步骤 C:把整个域名交给 Cloudflare(根治)
用本平台的「DNS 服务器」委派把 app.9k.beer 交给 Cloudflare 的 NS。 按 Cloudflare 的说法,NS 一生效,它会自动帮你创建那条指向 pages.dev 的 CNAME, 顶点 CNAME 在它自己那边是允许的(它有 CNAME 扁平化),所以这条路最干净。
前提是 Cloudflare 愿意把这个域名当 zone 收下 —— 这取决于 PSL; 如果它拒绝,用步骤 A 或 B。
「检查 DNS 记录」一直不过怎么办
2026-09-21 起,本平台已经原生支持了:在顶点加一条 CNAME 记录, 我们的权威服务器会同时给出 CNAME 应答(而不只是 A/AAAA 展开), 所以 Cloudflare 要读的那条 CNAME 是真实存在的,校验能过。你可以自己验:
bash
dig @ns1.hapdns.com app.9k.beer CNAME +short
# 应该显示:<你的项目>.pages.dev.
dig @ns1.hapdns.com app.9k.beer A +short
# 应该显示 Cloudflare 的地址(和 dig <你的项目>.pages.dev A 一样)如果还是停用,按顺序看三件事:
- 记录加对名字了吗:必须是
名称 = @(表示域名本身)。填app会建到app.app.9k.beer上(输入框下面那行灰字「将创建:…」会告诉你最终全名)。 - 平台里推上去了吗:老记录如果是在这次更新之前加的,去域名详情页点一次 「重新同步」,让服务器重新发布一遍。
- Cloudflare 那边点了检查吗:改完 DNS 要回它的 Custom domains 点 「检查 DNS 记录」,或者等它自己轮询(可能要几分钟)。
之前本站的文档写过"把域名委派给第三方 DNS(Gcore 等)来绕开这个问题"—— 那是 9-21 之前的临时办法,现在不需要了。如果你已经那样委派过, 想收回来就点「切换为系统默认DNS地址」→「保存设置」。
用顶点 CNAME 之前要知道的两个代价
- 目标解析不了,你这个域名整个解析不出来。 不是"少一条记录",是整个域名没答案。 目标站下线、域名过期、被墙,都会直接反映到访问上。
- 开了 DNSSEC 的域名不能用顶点 CNAME。 合成出来的答案不在签名范围内,验证型解析器会 当成伪造数据。平台会直接拒绝并提示你二选一。
排查
| 现象 | 原因 / 怎么办 |
|---|---|
打开报 522 | 域名没先在 Pages 项目里关联,或者 DNS 还没生效 |
| Custom domains 一直 pending | 多半是校验在读 CNAME,改用步骤 B |
dig 查不到地址 | 先 dig <你的项目>.pages.dev A 看目标本身通不通;目标不通,顶点 CNAME 也就没答案 |
| 刚加完记录查不到 | 改记录要等旧的 TTL 过期(调试期把 TTL 调到 300) |
| 解析没问题但证书报错 | 那是 Cloudflare 侧签发还没完成,等几分钟;反复不行就看它的 Custom domains 状态 |
其它服务商(Vercel、serv00、自建)见「接入自己的 DNS 服务商」。