跳转到内容
搜索文档

自定义域名

最后更新 查看 MarkdownAgent 设置

背景

自定义域名(Custom Domains)允许您将 Worker 连接到域名或子域名,而无需修改 DNS 设置或进行任何证书管理。为 Worker 设置自定义域名后,Cloudflare 将代表您创建 DNS 记录并颁发必要的证书。创建的 DNS 记录将直接指向您的 Worker。与路由(Routes)不同,自定义域名会将域名或子域名的所有路径指向您的 Worker。

自定义域名是在 Cloudflare zone 内指向域名或子域名(例如 example.comshop.example.com)的路由,Worker 作为源站。

如果您想让 Worker 连接到互联网,且没有需要始终与之通信的应用服务器,建议使用自定义域名。如果您确实有外部依赖,可以创建包含目标 URI 的 Request 对象,并使用 fetch() 进行访问。

自定义域名可以相互叠加。例如,如果您将 Worker A 绑定到 app.example.com,将 Worker B 绑定到 api.example.com,Worker A 可以对 api.example.com 调用 fetch() 来调用 Worker B。

自定义域名可以像任何外部依赖一样相互叠加

与路由不同,自定义域名还可以在同一 zone 内通过 fetch() 调用。

添加自定义域名

要添加自定义域名,您需要具备:

  1. 一个已激活的 Cloudflare zone
  2. 要调用的 Worker。

您可以通过 Cloudflare Dashboard、WranglerAPI 将自定义域名绑定到 Worker。

在 Cloudflare Dashboard 中设置自定义域名

要在 Cloudflare Dashboard 中设置自定义域名:

  1. 在 Cloudflare Dashboard 中,前往 Workers & Pages 页面。

    Go to Workers & Pages ↗
  2. Overview(概览) 中,选择您的 Worker。

  3. 前往 Settings(设置) > Domains & Routes > Add(添加) > Custom Domain(自定义域)

  4. 输入要为 Worker 配置的域名。

  5. 选择 Add Custom Domain(添加自定义域)

添加域名或子域名后,Cloudflare 将为您创建新的 DNS 记录。您可以添加多个自定义域名。

在 Wrangler 配置文件中设置自定义域名

要在 Wrangler 配置文件 中配置自定义域名,在 routes 下每个 pattern 添加 custom_domain=true 选项。例如,要配置自定义域名:

{
	"routes": [
		{
			"pattern": "shop.example.com",
			"custom_domain": true
		}
	]
}
[[routes]]
pattern = "shop.example.com"
custom_domain = true

要配置多个自定义域名:

{
	"routes": [
		{
			"pattern": "shop.example.com",
			"custom_domain": true
		},
		{
			"pattern": "shop-two.example.com",
			"custom_domain": true
		}
	]
}
[[routes]]
pattern = "shop.example.com"
custom_domain = true

[[routes]]
pattern = "shop-two.example.com"
custom_domain = true

Worker 间通信

在同一 zone 中,Worker 与运行在路由workers.dev 子域名上的另一个 Worker 通信的唯一方式是通过服务绑定(service bindings)

在同一 zone 中,如果 Worker 尝试与运行在自定义域名(而非路由)上的目标 Worker 通信,该限制将被解除。在同一 zone 内,从一个 Worker 向运行在自定义域名上的另一个 Worker 发送 fetch 请求将成功,无需服务绑定。

例如,考虑以下场景,两个 Worker 都运行在 example.com Cloudflare zone 上:

  • worker-a 运行在路由 auth.example.com/* 上。
  • worker-b 运行在路由 shop.example.com/* 上。

如果 worker-aworker-b 发送 fetch 请求,由于同 zone fetch 请求的限制,该请求将失败。worker-a 必须具有指向 worker-b 的服务绑定,此请求才能成功。

worker-ajs
export default {
	fetch(request) {
		// This will fail
		return fetch("https://shop.example.com")
	}
}

但是,如果 worker-b 改为设置在自定义域名 shop.example.com 上运行,fetch 请求将成功。

请求匹配行为

自定义域名不支持通配符 DNS 记录。传入请求必须与注册自定义域名的域名或子域名完全匹配。执行此匹配逻辑时,不会考虑 URL 的其他部分(路径、查询参数)。例如,如果您在 api.example.com 上创建指向 api-gateway Worker 的自定义域名,对 api.example.com/loginapi.example.com/user 的请求都会调用同一个 api-gateway Worker。

自定义域名遵循标准 DNS 排序和匹配逻辑

与路由的交互

运行在自定义域名上的 Worker 被视为源站。在自定义域名之前的路由上运行的任何 Worker 都可以选择通过使用传入的 Request 对象发出 fetch(request) 来调用注册在自定义域名上的 Worker。这意味着您可以在请求到达自定义域名 Worker 之前设置 Worker 运行。换句话说,您可以在同一请求中链接两个 Worker。

例如,考虑以下工作流:

  1. api.example.com 的自定义域名指向您的 api-worker Worker。
  2. 添加到 api.example.com/auth 的路由指向您的 auth-worker Worker。
  3. api.example.com/auth 的请求将触发您的 auth-worker Worker。
  4. auth-worker Worker 内使用 fetch(request) 将调用 api-worker Worker,就像调用普通应用服务器一样。
auth-workerjs
export default {
	fetch(request) {
		const url = new URL(request.url)
		if(url.searchParams.get("auth") !== "SECRET_TOKEN") {
			return new Response(null, { status: 401 })
		} else {
			// This will invoke `api-worker`
			return fetch(request)
		}
	}
}

证书

创建自定义域名还将在目标 zone 中为目标主机名生成高级证书(Advanced Certificate)

这些证书使用默认设置生成。要覆盖这些设置,请删除生成的证书并在 Cloudflare Dashboard 中创建您自己的证书。有关说明,请参阅管理高级证书

在 www 和根域名之间重定向

由于自定义域名需要精确的主机名匹配,绑定到 example.com 的 Worker 不会收到发送到 www.example.com 的请求,反之亦然。要使域名的两个版本都能工作,请设置重定向规则:

您还需要为要重定向来源的主机名设置代理 DNS 记录,以便 Cloudflare 应用重定向规则。

  • 从 www 到根域名:为 www 添加指向 192.0.2.0 的代理 DNS A 记录,或指向 100:: 的代理 AAAA 记录
  • 从根域名到 www:为根域名添加指向 192.0.2.0 的代理 DNS A 记录,或指向 100:: 的代理 AAAA 记录

从路由迁移

如果您当前使用带有 /*路由调用 Worker,并且有指向 100:: 或类似地址的 CNAME 记录,建议使用自定义域名作为替代。

通过 Cloudflare Dashboard 从路由迁移

要迁移路由 example.com/*

  1. 在 Cloudflare Dashboard 中,前往您域名的 DNS Records(DNS 记录) 页面。

    Go to Records ↗
  2. 删除 example.com 的 CNAME 记录。

  3. 前往 Account Home(账户主页) > Workers & Pages

  4. Overview(概览) 中,选择您的 Worker > Settings(设置) > Domains & Routes(域和路由)

  5. 选择 Add(添加) > Custom domain(自定义域) 并添加 example.com

  6. 删除位于 Worker > Settings(设置) > Domains & Routes(域和路由) 中的路由 example.com/*

通过 Wrangler 从路由迁移

要在 Wrangler 配置文件 中迁移路由 example.com/*

  1. 在 Cloudflare Dashboard 中,前往您域名的 DNS Records(DNS 记录) 页面。

    Go to Records ↗
  2. 删除 example.com 的 CNAME 记录。

  3. 将以下内容添加到 Wrangler 文件:

    {
      "routes": [
        {
          "pattern": "example.com",
          "custom_domain": true
        }
      ]
    }
    [[routes]]
    pattern = "example.com"
    custom_domain = true
  4. 运行 npx wrangler deploy 以创建 Worker 将运行的自定义域名。

这篇文档对您有帮助吗?