Cloudflare Pages 绑定自定义域名:我踩过的四个坑
Pages 部署本身很顺——wrangler pages deploy 一条命令就上线了。但从 xxx.pages.dev 换成自己的域名,我连着踩了四个坑,每个都卡了十几分钟。
坑一:wrangler 登录的权限不含 DNS
wrangler login 走的是 OAuth,授权范围包括 pages:write、zone:read、workers:write,但没有 dns:write。
结果是:我能把域名"添加"到 Pages 项目里,但 Pages 想自动创建那条 CNAME 时失败了——因为我这个调用方没权限。域名卡在 initializing,DNS 里空空如也。
解决办法:单独建一个 API Token,权限选 Zone → DNS → Edit,范围限定到那个域名。这个 token 后面加记录、改代理开关都能用。
坑二:手工加 CNAME 后,域名一直是 pending,访问返回 522
有 DNS 权限之后,我手工加了两条记录:
yuwenyule.top CNAME tools-site-2xt.pages.dev 🟠 已代理
www.yuwenyule.top CNAME tools-site-2xt.pages.dev 🟠 已代理
DNS 立刻生效了,解析到的是 Cloudflare 的 IP。但访问站点返回 522(连接超时)。
原因:Pages 侧的域名状态还是 pending,Cloudflare 不认为这个 hostname 归 Pages 管,于是当普通源站处理——把请求转发到 pages.dev,而 pages.dev 本身也是 Cloudflare 代理的域名,来回打转,最后超时。
522 不一定是源站挂了。在 Pages 场景下,"域名还没激活"也会表现为 522。
坑三:PATCH 重试无效,必须"删了重加"
Pages API 提供了一个 PATCH 接口用于重试验证:
PATCH /accounts/{account_id}/pages/projects/{project}/domains/{domain}
返回 200,状态还是 pending,等 40 秒再看,纹丝不动。
真正管用的是**先 DELETE 再 POST**:
DELETE /accounts/{id}/pages/projects/tools-site/domains/yuwenyule.top
POST /accounts/{id}/pages/projects/tools-site/domains {"name": "yuwenyule.top"}
删掉重加之后,60 秒内状态从 initializing 变成 active,站点立刻能访问。
猜测原因是:第一次添加时 DNS 记录还不存在,Pages 的验证失败并进入了死锁状态,只有重新走一遍流程才会重新检查。
坑四:100MB 和 25MB 两个限制
站里有几个客户端安装包要放,结果撞上两道墙:
| 限制 | 数值 | 影响 |
|---|---|---|
| Pages 单文件 | 25 MiB | 超过就部署失败 |
| Cloudflare 代理单响应 | 100 MB(免费版) | 文件能存到别处,但经 CF 代理下不下来 |
一个 138MB 的压缩包,两个限制都过不去。
解决办法:把文件放到独立服务器,DNS 记录设成"仅 DNS"(灰云),让流量直连源站,完全绕过 Cloudflare 的代理限制。
dl.yuwenyule.top A 18.136.29.95 ⚪ 仅 DNS(灰云)
代价是失去了 CDN 缓存和 DDoS 防护,但下载站这点流量用一台 1TB/月的机器绰绰有余。
四条经验总结
| 现象 | 真实原因 | 解法 |
|---|---|---|
| 域名加不进去 / 没有 DNS 记录 | wrangler token 缺 dns:write | 建专用 API Token |
| 访问返回 522 | Pages 域名还在 pending | 查 Pages domains 状态,别只看 DNS |
| PATCH 重试无效 | 验证死锁 | 删除后重新添加 |
| 大文件下载失败 | 25MB / 100MB 限制 | 独立服务器 + 灰云 DNS |
查 Pages 域名状态可以用 API,比在控制台刷新快:
GET /accounts/{account_id}/pages/projects/{project}/domains
看 status 字段:initializing → pending → active,只有 active 才是真的好了。