KernelRanch
返回文章列表

Pages 自定义域与预览部署:换域名,也换预览地址

2026-11-10 #Cloudflare

读完这篇你能做到:给自己的 Pages 项目绑上正式域名并拿到自动签发的证书;让每个分支的推送各自生成一个可访问的预览地址;在不合并代码的前提下把预览链接发给同事看,同时不让搜索引擎抓到这些临时地址。

前提是项目已经能部署,且域名已经托管在同一个 Cloudflare 账号下。域名怎么接入见 49-add-domain-to-cloudflare.md,证书机制见 51-free-https-edge-certificate.md。项目本身还没建的话,先走 67-pages-getting-started.md。

1. 三种域名形态

先把概念分开,后面操作就不容易乱。

形态例子用途
生产域名www.example.com对外正式访问
项目默认域my-site.pages.dev平台分配,一直都在
预览地址a1b2c3d4.my-site.pages.dev每次部署一个,按 commit hash 生成
分支别名dev.my-site.pages.dev指向某分支的最新一次部署

预览地址和分支别名不会随项目删除而失效,它们是平台侧的记录。项目默认域也建议保留,绑自有域名出问题时它是唯一的对照入口。绑定时如果域名上还留着旧的 A 记录指向别处,要先删掉,否则验证会卡在解析不一致上,页面一直显示待验证。

2. 绑定生产域名

控制台路径:项目详情 → Custom domains → Set up a custom domain。

  1. 输入要绑的域名,例如 www.example.com,点 Continue。
  2. 如果这个域在同一账号下,平台会自动在 DNS 里创建一条 CNAME,指向 my-site.pages.dev。
  3. 域名不在同一账号,页面会给出手动配置提示,需要自己去 DNS 服务商加一条 CNAME 记录。
  4. 等待激活。DNS 生效后证书签发通常在几分钟内完成,失败会显示状态,可以点重试。

绑 apex(example.com,不带 www)也能做,走的是 CNAME 拉平。真正的问题不是能不能绑,而是 apex 和 www 各自指向哪里:常见做法是选一个作为主域,另一个用重定向指过去。重定向的写法在 75-redirects-bulk.md。

一个项目可以绑 100 个自定义域(免费档),多域名指向同一站点是允许的;SEO 上通常选一个当主域,其余 301 过去,权重不至于分散。

3. 用预览部署

默认行为:推送到生产分支更新生产环境,推送到其他分支生成预览部署,地址形如 <8位hash>.<project>.pages.dev。

拿到地址有两条路:

部署详情页会直接显示这次的预览 URL,复制即可。

用分支别名更稳定,<branch>.<project>.pages.dev 永远指向该分支最新一次成功部署。前端联调时把别名发给后端,比每次贴新 hash 省事。

生产分支在项目 Settings 的 Builds & deployments 里改。把 main 改成 release,之后只有推 release 才更新生产环境。

4. 预览环境别裸奔

预览地址是公开可访问的,知道 URL 的人都能打开。里面有未发布的文案、测试数据、甚至调试接口时,需要挡住。

三个层次,按需要选:

_headers 里给预览加 X-Robots-Tag: noindex,让搜索引擎不收录。这份文件对所有部署生效,也包括生产环境,所以要确认不影响正式站。

Cloudflare Access 套在 *.my-site.pages.dev 上,访问前先过身份验证。Zero Trust 免费档够小团队用,策略按邮箱域或一次性 PIN 配就行。

直接关掉预览部署。项目 Settings 里有开关,关掉后非生产分支不再生成预览,适合只有一个人在维护的项目。关掉之后分支别名也一并失效,要恢复得重新推一次代码。

5. 绑完域名的检查清单

检查项期望结果
curl -I https://www.example.com返回 200,有 cf-cache-status
证书浏览器显示有效,签发者是 Cloudflare 或你的 CA
http:// 访问自动跳到 https://,没有混合内容告警
旧 pages.dev 地址仍可访问,未被删除
预览地址按需可访问或被 Access 挡住

curl -I 只看头,比打开浏览器快。返回里出现 server: cloudflare 说明请求确实走到了边缘。

常见问题

域名加进去一直显示待验证。

多数是 CNAME 没生效或指错了目标。用 nslookup www.example.com 确认解析结果是不是 my-site.pages.dev。另一种情况是域名在别的 Cloudflare 账号下,此时自动建记录不会发生,只能手动配。

apex 和 www 都要绑吗。

绑一个作为主域,另一个做 301 指过来。两个都绑也能访问,但同一份内容出现在两个地址上,搜索引擎会当成重复页面,权重分散。

预览地址会不会被 Google 抓到。

有这个可能,尤其是预览链接被贴进公开的 issue 或聊天群之后。加 X-Robots-Tag 或直接上 Access 是成本最低的两道防线。

小结

自定义域解决"对外用什么地址",预览部署解决"改完先给谁看"。两件事在 Pages 里都不需要写配置:绑域名是控制台点几下加一条 CNAME,预览是推送分支的副产品。

需要提前定的是域名策略:主域选 apex 还是 www、另一个怎么跳、预览环境要不要挡。这三条定了,后面接缓存规则和重定向时不会互相打架。

数据来源与检索时间

检索时间 2026-11-10。

来源URL对应数据
Pages Limitshttps://developers.cloudflare.com/pages/platform/limits/免费档每个项目 100 个自定义域
Pages 自定义域文档https://developers.cloudflare.com/pages/configuration/custom-domains/同账号自动创建 CNAME、异账号手动配置、证书自动签发
Pages 预览部署文档https://developers.cloudflare.com/pages/configuration/preview-deployments/<hash>.<project>.pages.dev 与分支别名的地址形态

核验说明

  • 文档部分:自定义域数量上限来自 2026-11-10 抓取的 Pages Limits 页面。绑定流程与预览地址形态依据官方文档描述,未逐字引用。
  • 未执行:本机 Token 没有 Zone 与 Pages 权限,没有绑定过任何自定义域,也没有创建过 Pages 项目。控制台里的每一步都是文档描述,不是操作记录。
  • 未执行:curl -I 检查清单没有对真实 Pages 站点跑过,这一项是给读者的自查方法。
  • 未执行:Cloudflare Access 的配置未操作,免费档用户数上限未在本机核对。