发布于: -/最后更新: -/5 分钟/

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

摘要

Cloudflare Workers可以绑定第三方域名,通过Cloudflare For SaaS服务实现。用户需设置DNS记录和Fallback Origin,创建流量管理Worker,并配置路由。新客户接入时需重复添加自定义主机名和DNS记录,使用KV管理域名和Worker绑定以简化流程。

默认自定义域名只可以绑定由自己的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用来管理流量导向

  1. 创建一个新的 Worker, 我们称之为 platform-router,这里使用Hono来配置

  2. 配置 wrangler.jsonc(服务绑定):

    JSON
    {
      "$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"
        }
      ]
    }
  3. 运行cf-typegen生成类型

  4. 编写 src/index.ts (Hono 路由逻辑):

    TSX
    import { Hono } from "hono";
    
    const HOSTNAME_TO_SERVICE: Record<string, keyof CloudflareBindings> = {
      "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;
  5. 部署该worker

配置 Worker Routes

把所有的流量,都交给 platform-router 这个路由来处理

  • xxx.com 域中,进入 Workers Routes 页面。

  • 点击 Add route (添加路由)。

  • 路由 (Route): */*

  • 服务 (Service): platform-router

  • 点击 Save

  • 注意:如果你还有其它worker,需要指定添加精确的route来把流量导向正确的worker

接入客户域名 client-a.com

每次有新客户时都需要重复的步骤

  • (你的操作)xxx.comSSL/TLS -> 自定义主机名 页面:

    1. 点击 “Add Custom Hostname”。

    2. 输入 client-a.com

    3. (最佳实践)Certificate validation method (证书验证方法) 改为 HTTP Validation。这能让客户少配一条 TXT 记录。

    4. 点击 “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配置

JSON
{
	"$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代码

TSX
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)的标准流程

  1. (部署 App) 部署你的新客户应用 client-b-app

  2. (添加绑定) 进入 platform-router -> Settings -> Bindings

    • 类型: Service binding

    • 变量名 (Binding Name): CLIENT_B_SERVICE

    • 服务 (Service): client-b-app

    • 点击 Save and deploy (这会触发一次配置更新)。

  3. (添加路由) 进入 KV -> HOST_TO_SERVICE_MAP

    • Key: client-b.com

    • Value: CLIENT_B_SERVICE (必须和上一步的变量名完全一样)

  4. (添加SaaS域名) 进入 SSL/TLS -> 自定义主机名

    • 点击 Add Custom Hostname,输入 client-b.com

    • (最佳实践)Certificate validation method 改为 HTTP Validation

  5. (发送DNS) 把 Cloudflare 提供的两条 DNS 记录发给客户:

    • CNAME 记录:

      • Host: client-b.com (或 @)

      • Value: platform.ng-technology.org (你的“锚点”)

    • TXT 记录:

      • Host: _cf-custom-hostname.client-b.com

      • Value: [Cloudflare 提供的那串 UUID]

正文结束