博客

SaaS 自定义域名:用 Cloudflare for SaaS 让客户使用自己的域名

用 Cloudflare for SaaS 让客户把自己的域名指向你的 SaaS:验证如何运作、截至 2026 年 10 月的费用,以及哪些地方容易出问题。

作者: Nicolás Cerón ·

夜晚街道上一排风格各异的店面,人行道下方的剖面图中,深红色线缆将每家店铺连接到同一个共用机房。

简短回答

要让客户通过自己的域名(例如 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。

流程如何运作

  1. 客户在你应用的设置中输入域名。你的后端对其进行规范化处理,然后调用 Create Custom Hostname 接口,并指定证书验证方式。
  2. 客户添加你提供的 DNS 记录,例如 portal.customer.com CNAME customers.yourapp.com。
  3. Cloudflare 验证主机名的所有权。CNAME 出现时会运行实时验证,这可能导致短暂的停机。预验证在 DNS 变更之前使用 TXT 记录或 HTTP 令牌,适用于已经上线的域名。如果客户自己的区域也在 Cloudflare 上(即“Orange-to-Orange”设置),则不支持预验证。
  4. 证书颁发机构验证域名控制权并签发证书。
  5. 当 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 月)

FreeProBusinessEnterprise
包含的主机名数量100100100自定义
每增加一个主机名的价格$0.10$0.10$0.10自定义
主机名数量上限50,00050,00050,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 SaaSVercelNetlify
域名限制包含 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进您的产品,请告诉我们您的应用情况。