简短回答
要让客户通过自己的域名(例如 portal.customer.com)访问你的应用,需要在你的 Cloudflare 区域(zone)中将该域名注册为自定义主机名。客户添加一条指向你的 CNAME 记录,Cloudflare 验证其对该主机名的控制权,由证书颁发机构签发证书,随后请求就会到达你的应用。
截至 2026 年 10 月,Cloudflare for SaaS 套餐页面显示,Free、Pro 和 Business 套餐包含 100 个自定义主机名,每增加一个收费 $0.10,这些套餐的主机名上限为 50,000 个。
有两个限制会影响所有设计方案。没有付费的 Enterprise 附加服务,客户无法把裸顶级域名(customer.com)指向你。而通配符自定义主机名、自定义证书以及证书颁发机构的选择,仅限 Enterprise 套餐。Cloudflare 的配置只需几个步骤,围绕它的产品工作则耗时更长,本指南大部分内容也正是围绕这一点。
什么是自定义主机名
自定义主机名是客户拥有的域名,由 Cloudflare 路由到你的区域。设置指南包含四个部分:
- SaaS 区域。你自己在 Cloudflare 上的域名,并已启用 Cloudflare for SaaS。Free 套餐的区域就足以起步。
- 回退源站。一条经过代理的 DNS 记录,例如
proxy-fallback.yourapp.com,自定义主机名的流量会发往这里。 - CNAME 目标。可选项,是一个更易记的名称,供客户指向,例如
customers.yourapp.com。 - 自定义主机名。客户的域名,通过 API 或控制台创建,有各自的验证状态。Cloudflare 会为每个主机名签发两张证书:一张 ECDSA P-256 主证书,以及一张供旧版客户端使用的 RSA 2048 位备用证书。
如果你的应用运行在 Cloudflare Workers 上(Dardo 也是基于这个平台构建的),Worker 可以作为回退源站。*/* 路由会捕获所有自定义主机名的请求,你的代码读取 Host 请求头来识别租户。Cloudflare 也提供按主机名设置的自定义元数据,但这是付费的 Enterprise 附加服务,因此在其他套餐中,这类查询要放在你自己的数据库里,例如 D1。
流程如何运作
- 客户在你应用的设置中输入域名。你的后端对其进行规范化处理,然后调用 Create Custom Hostname 接口,并指定证书验证方式。
- 客户添加你提供的 DNS 记录,例如
portal.customer.com CNAME customers.yourapp.com。 - Cloudflare 验证主机名的所有权。CNAME 出现时会运行实时验证,这可能导致短暂的停机。预验证在 DNS 变更之前使用 TXT 记录或 HTTP 令牌,适用于已经上线的域名。如果客户自己的区域也在 Cloudflare 上(即“Orange-to-Orange”设置),则不支持预验证。
- 证书颁发机构验证域名控制权并签发证书。
- 当
status和ssl.status都为active,且 DNS 指向你的目标时,主机名即就绪。Cloudflare 提醒,TLS 握手可能在ssl.status变为 active 之前就已成功,因此应以自定义主机名详情接口返回的结果为准。
证书验证方式
Cloudflare 的验证指南提供以下选项:
| 方式 | 客户需要做什么 | 能否在 DNS 切换前使用 | 说明 |
|---|---|---|---|
| HTTP,自动 | 只需添加 CNAME | 否 | 最简单。当客户“可以接受几分钟的停机”时,Cloudflare 建议使用这种方式。 |
| HTTP,手动 | 如果域名已指向你,则无需任何操作;否则需要在其当前服务器上提供你的令牌 | 是 | 适用于域名正在其他服务商处运行的情况。 |
| TXT | 添加你提供的 TXT 记录 | 是 | 通配符主机名必须使用。 |
| 委派 DCV | 一次性添加一条 _acme-challenge CNAME | 是 | 让 Cloudflare 能够续期之后的所有证书。已有的 _acme-challenge TXT 记录会导致无法使用。 |
验证不会无限期等待。Cloudflare 会在七天内重试主机名验证 75 次,并且根据其退避计划,“如果验证未成功,该自定义主机名将被删除。”证书令牌同样会过期:使用 Let's Encrypt 时为 7 天,使用 Google Trust Services 或 SSL.com 时为 14 天。
费用(截至 2026 年 10 月)
| Free | Pro | Business | Enterprise | |
|---|---|---|---|---|
| 包含的主机名数量 | 100 | 100 | 100 | 自定义 |
| 每增加一个主机名的价格 | $0.10 | $0.10 | $0.10 | 自定义 |
| 主机名数量上限 | 50,000 | 50,000 | 50,000 | 不限(超过 50,000 个请联系销售) |
| 通配符自定义主机名 | 否 | 否 | 否 | 是 |
| 自定义证书及可选 CA | 否 | 否 | 否 | 是 |
| 顶级域名代理 / BYOIP | 否 | 否 | 否 | 付费附加服务 |
| 自定义元数据 | 否 | 否 | 否 | 付费附加服务 |
套餐页面列出的 $0.10 没有注明计费周期。Cloudflare 在 2022 年的公告中称,价格从“每月 $2 降至 $0.10”。按这个月费计算,1,000 个客户域名意味着在包含的 100 个之外还有 900 个,即每月 $90。
有两条计费规则对产品设计很重要。根据 Cloudflare 的配额与计费页面,每个主机名在删除之前都会计入用量,包括“等待验证或激活的主机名”。此外,非 Enterprise 套餐设有 API 强制阈值,超过后新的主机名会被拒绝。
哪里容易出问题
顶级域名
Cloudflare 的设置指南说得很明确:“默认情况下,不支持使用 A 记录指向目标。”大多数 DNS 服务商不允许在域名根部设置 CNAME,因此客户需要使用子域名,例如 www.customer.com 或 app.customer.com。Apex proxying会为你的账户分配静态 IP 前缀,让客户可以使用 A 记录,但它是企业版的附加功能,需要另外付费。如果没有它,就请客户使用子域名,并说明如何在其 DNS 服务商处把裸域名转发到该子域名。
证书颁发机构与 CAA 记录
Cloudflare 的证书颁发机构参考文档列出了自定义主机名可用的 Let's Encrypt(90 天证书)、Google Trust Services 和 SSL.com(14、30 或 90 天)。只有企业版可以选择 CA;否则 Cloudflare 使用默认 CA,并会先检查 CAA 记录。如果客户的 CAA 记录不允许该 CA,签发就会失败,并提示“CAA records block issuance”,这只能由客户自行修复。CAA 查询会沿着 CNAME 链进行,所以你自己目标域名的 CAA 记录也会生效。故障排查指南列出了其他由客户一侧造成的故障:DNSSEC 配置错误,以及 DNS 服务器返回 SERVFAIL。
续期
自定义主机名证书的有效期为 90 天,可在到期前 30 天续期。处于活跃状态的非通配符主机名会通过 HTTP 自动续期。如果主机名不再处于活跃状态,例如客户更改了 DNS,客户就必须放置新的令牌,而把令牌发给客户是你的责任。通配符只能通过 TXT 续期,而 Delegated DCV 可以将这一过程自动化。
使用其他 CDN 或 Cloudflare 的客户
Cloudflare 表示,当其他 CDN 隐藏了 DNS 记录时,使用其他 CDN 的自定义主机名并不兼容。域名托管在 Cloudflare 上的客户则会带来相反的问题:如果他们离开后你没有删除其主机名,即使他们更改了 DNS,该主机名仍可能继续路由到你的服务。
验证路径前的 Worker
如果你的回退源站是 Worker,它必须原样放行 /.well-known/pki-validation/* 和 /.well-known/acme-challenge/*。如果有一条兜底路由返回应用的 404 页面,就会导致 HTTP 验证失败。
围绕它的产品工作
- 套餐限制。确定哪些套餐包含自定义域名、数量是多少,并在调用 Cloudflare 之前先检查。它的配额和阈值只是上限,并不是你的定价。
- 引导页面。只需一个输入框。转为小写,去掉协议和路径,拒绝裸顶级域名(除非你购买了 apex proxying),也拒绝你自己的 zone 名称,Cloudflare 明确说明绝不要把它创建为自定义主机名。然后展示需要添加的准确记录,并提供复制按钮。
- 用通俗语言展示两种状态。主机名和证书是分别验证的,所以两者都要展示。把
ssl.validation_errors转换成操作说明:“您域名的 CAA 记录不允许我们的证书颁发机构,请添加这条记录”,比“pending_validation”更有用。创建响应中可能还不包含验证记录,所以请稍等片刻后再次获取该主机名。Cloudflare 的Webhook 通知会报告验证和签发事件,比轮询更好。 - 续期监控。每天运行一次任务,标记证书未处于活跃状态或 DNS 不再指向你的主机名,让你的团队比客户更早得知问题。
- 清理。删除始终未通过验证的主机名,以及已离开客户的主机名。两者在删除之前都会计费。
- 租户隔离。只根据你数据库中处于活跃状态的主机名来确定租户。如果租户还会获得你域名的子域名,Vercel 的域名文档指出,某个租户为父域名设置的 Cookie 会影响其他租户,因此请把你的管理后台和登录放在单独的域名上。
- 支持手册。为团队准备一页简短的文档,把每种错误对应到由谁来修复:缺少 CNAME、CAA、DNSSEC 和 SERVFAIL 由客户负责;令牌、CA 速率限制和 Worker 路由由你负责。
这正是 Dardo 在Web 应用开发中所做的工作,而白标客户门户是最常被要求提供自定义域名的场景。
替代方案:Vercel 和 Netlify
如果你的应用已经运行在别处,这两个托管平台都能处理客户域名,截至 2026 年 10 月,它们各有文档中说明的限制。
| Cloudflare for SaaS | Vercel | Netlify | |
|---|---|---|---|
| 域名限制 | 包含 100 个,免费版、Pro 和 Business 最多可达 50,000 个 | Hobby 版每个项目 50 个;Pro 和企业版为“无限制”,软限制分别为 100,000 和 1,000,000 | “我们建议为一个站点分配的域名别名不超过 50 个” |
| 顶级域名(Apex) | 企业版附加功能 | 将 A 记录指向项目域名卡片上的值 | ALIAS、ANAME 或扁平化 CNAME,或使用 A 记录作为备用 |
| 证书 | 自动签发,每个主机名两张;企业版支持自定义证书 | 域名验证后自动签发;企业版支持自定义证书 | 自动使用 Let's Encrypt;自定义证书需手动续期 |
| 通配符 | 企业版 | 需要使用 Vercel 域名服务器,或委派 _acme-challenge | 使用 Netlify DNS 的域名可自动支持 |
| 适用场景 | 同一个 zone 下有大量客户域名 | 提供 REST API 和 SDK 的多租户平台 | 每个站点最多几十个域名 |
Vercel 对顶级域名的支持是最明显的差异:客户可以用 A 记录将裸域名指向它。请注意,根据 Vercel 的合理使用准则,Hobby 套餐仅限“非商业、个人使用”,所以付费的 SaaS 应从 Pro 起步。Netlify 建议最多 50 个别名,因此不适合用一个部署来服务数百个客户域名。
何时开始构建
如果只有两三个客户提出需求,就在 Cloudflare 控制台中添加他们的主机名,并维护一份检查清单。当自定义域名成为你所售套餐或白标方案的一部分时,再构建自助流程。如果客户需要大规模使用裸顶级域名或通配符,请在围绕这些限制做设计之前,先与 Cloudflare 洽谈企业版。
如果您希望把这套流程(包括上述的状态、提醒和支持说明)直接built进您的产品,请告诉我们您的应用情况。
