Cloudflare Workers绑定第三方域名提供商

默认自定义域名只可以绑定由自己的Cloudflare账号管理的域名，其实由方法可以绑定第三方域名提供商的域名，Cloudflare有个服务叫做Cloudflare For Saas就是专门解决这个情况的。它的免费额度是可以绑定100个Custom Host Name，然后每超一个就加$0.1 但是虽然说是免费的，还是要绑定付款方式才可以白嫖，和R2一样。使用场景接下来假设这么一个场景：你有一个域名是xxx.com 你给客户做了一个网站部署到了client-A-worker上客户有自己的域名，不能接受修改NameServer，是client-a.com 你想要让client-a.com的流量指向client-A-worker 示意图示意图 步骤设置100:: DNS Record 先要设置所有流量的入口在xxx.com的DNS Record里添加一条新的AAAA记录类型 (Type): AAAA 名称 (Name): platform (这个名字可以自定，fallback, proxy 都行，platform 很清晰) IPv6 地址 (Address): 100:: (这是一个“黑洞”保留地址，流量不会真的去这里) 代理 (Proxy): 必须开启 (显示为橙色云) 设置 Fallback Origin 在 xxx.com 域中，进入 SSL/TLS -> 自定义主机名 (Custom Hostnames)。在页面上方找到 Fallback Origin (回退源) 卡片。在输入框中填入你上一步创建的地址：platform.xxx.com 点击 “Add” (添加)。稍等片刻，Fallback Origin status (回退源状态) 会变为 Active (绿色)。新建一个worker用来管理流量导向创建一个新的 Worker, 我们称之为 platform-router，这里使用Hono来配置配置 wrangler.jsonc(服务绑定): { "$schema": "node_modules/wrangler/config-schema.json", "name": "platform-router", "main": "src/index.ts", "compatibility_date": "2025-11-13", "observability": { "enabled": true }, "services": [ { "binding": "CLIENT_A", "service": "client-A-worker" } ] } 运行cf-typegen生成类型编写 src/index.ts (Hono 路由逻辑): import { Hono } from "hono"; const HOSTNAME_TO_SERVICE: Record = { "client-a.com": "CLIENT_A", }; const app = new Hono<{ Bindings: CloudflareBindings }>(); app.all("*", async (c) => { const hostname = c.req.header("host")?.toLowerCase(); if (!hostname) { return c.text("No hostname provided.", 400); } const bindingName = HOSTNAME_TO_SERVICE[hostname]; if (!bindingName) { return c.text(`Hostname ${hostname} is not configured.`, 404); } const service = c.env[bindingName] as Fetcher | undefined; if (!service?.fetch) { return c.text(`Service ${bindingName} is not configured.`, 500); } return await service.fetch(c.req.raw); }); export default app; 部署该worker 配置 Worker Routes 把所有的流量，都交给 platform-router 这个路由来处理在 xxx.com 域中，进入 Workers Routes 页面。点击 Add route (添加路由)。路由 (Route): */* 服务 (Service): platform-router 点击 Save 注意：如果你还有其它worker，需要指定添加精确的route来把流量导向正确的worker 接入客户域名 client-a.com 每次有新客户时都需要重复的步骤 (你的操作) 在 xxx.com 的 SSL/TLS -> 自定义主机名 页面：点击 “Add Custom Hostname”。输入 client-a.com。 (最佳实践) 将 Certificate validation method (证书验证方法) 改为 HTTP Validation。这能让客户少配一条 TXT 记录。点击 “Add”。 (你的操作) 复制 DNS 记录，发给客户。点击刚添加的、处于 Pending 状态的 client-a.com。你现在会看到两条需要客户添加的 DNS 记录。你把这两条记录发给你的客户。 (客户的操作) 客户登录 Namecheap (或他的服务商)：记录 1 (最重要 - 流量 CNAME)：类型: CNAME 主机 (Host): @ (如果他要绑 Apex 域名) 或 www (如果他绑子域名 www.client-a.com) 值 (Value): platform.xxx.com (对，就是 CNAME 到你的“总入口”) 记录 2 (授权 TXT)：类型: TXT 主机 (Host): _cf-custom-hostname (如果绑 Apex) 或 _cf-custom-hostname.www (如果绑子域名) 值 (Value): [Cloudflare 提供的那一长串 UUID 字符串] 优化使用KV来管理新添加的域名和Worker绑定，以后只需要去KV里手动添加新的域名，然后再Worker Dashboard里添加新的Service Binding，不用修改代码即可实现更新修改Wrangler配置 { "$schema": "node_modules/wrangler/config-schema.json", "name": "platform-router", "main": "src/index.ts", "compatibility_date": "2025-11-13", "observability": { "enabled": true }, "kv_namespaces": [ { "binding": "HOST_TO_SERVICE_MAPPING", "id": "your-kv-id" } ], } 别忘了cf-typegen生成类型修改Worker代码 import { Hono } from "hono"; interface Env extends CloudflareBindings { [key: string]: any; } const app = new Hono<{ Bindings: Env }>(); app.all("*", async (c) => { // 1. 获取请求的 hostname const hostname = c.req.header("host"); if (!hostname) { return c.text("Missing host header", 400); } // 2. 从 KV 中获取对应的 binding name const bindingName = await c.env.HOST_TO_SERVICE_MAPPING.get(hostname); if (!bindingName) { return c.text(`Hostname ${hostname} is not configured.`, 404); } // 3. 根据 binding name 获取对应的 service const service = c.env[bindingName] as Fetcher | undefined; if (!service || typeof service.fetch !== "function") { console.error( `Config error: KV points to invalid or missing binding: ${bindingName}` ); return c.text("Internal Server Error: Service Misconfiguration", 500); } // 4. 转发请求到对应的 service return service.fetch(c.req.raw); }); export default app; 接入新客户（client-b.com）的标准流程 (部署 App) 部署你的新客户应用 client-b-app (添加绑定) 进入 platform-router -> Settings -> Bindings：类型： Service binding 变量名 (Binding Name): CLIENT_B_SERVICE 服务 (Service): client-b-app 点击 Save and deploy (这会触发一次配置更新)。 (添加路由) 进入 KV -> HOST_TO_SERVICE_MAP： Key: client-b.com Value: CLIENT_B_SERVICE (必须和上一步的变量名完全一样) (添加SaaS域名) 进入 SSL/TLS -> 自定义主机名：点击 Add Custom Hostname，输入 client-b.com。 (最佳实践) 将 Certificate validation method 改为 HTTP Validation。 (发送DNS) 把 Cloudflare 提供的两条 DNS 记录发给客户： CNAME 记录: Host: client-b.com (或 @) Value: platform.ng-technology.org (你的“锚点”) TXT 记录: Host: _cf-custom-hostname.client-b.com Value: [Cloudflare 提供的那串 UUID]