自定义域名(Custom Domains)允许您将 Worker 连接到域名或子域名,而无需修改 DNS 设置或进行任何证书管理。为 Worker 设置自定义域名后,Cloudflare 将代表您创建 DNS 记录并颁发必要的证书。创建的 DNS 记录将直接指向您的 Worker。与路由(Routes)不同,自定义域名会将域名或子域名的所有路径指向您的 Worker。
自定义域名是在 Cloudflare zone 内指向域名或子域名(例如 example.com 或 shop.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() 调用。
要添加自定义域名,您需要具备:
- 一个已激活的 Cloudflare zone。
- 要调用的 Worker。
您可以通过 Cloudflare Dashboard、Wrangler 或 API 将自定义域名绑定到 Worker。
要在 Cloudflare Dashboard 中设置自定义域名:
-
在 Cloudflare Dashboard 中,前往 Workers & Pages 页面。
Go to Workers & Pages ↗ -
在 Overview(概览) 中,选择您的 Worker。
-
前往 Settings(设置) > Domains & Routes > Add(添加) > Custom Domain(自定义域)。
-
输入要为 Worker 配置的域名。
-
选择 Add Custom Domain(添加自定义域)。
添加域名或子域名后,Cloudflare 将为您创建新的 DNS 记录。您可以添加多个自定义域名。
要在 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在同一 zone 中,Worker 与运行在路由或 workers.dev 子域名上的另一个 Worker 通信的唯一方式是通过服务绑定(service bindings)。
在同一 zone 中,如果 Worker 尝试与运行在自定义域名(而非路由)上的目标 Worker 通信,该限制将被解除。在同一 zone 内,从一个 Worker 向运行在自定义域名上的另一个 Worker 发送 fetch 请求将成功,无需服务绑定。
例如,考虑以下场景,两个 Worker 都运行在 example.com Cloudflare zone 上:
如果 worker-a 向 worker-b 发送 fetch 请求,由于同 zone fetch 请求的限制,该请求将失败。worker-a 必须具有指向 worker-b 的服务绑定,此请求才能成功。
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/login 或 api.example.com/user 的请求都会调用同一个 api-gateway Worker。
运行在自定义域名上的 Worker 被视为源站。在自定义域名之前的路由上运行的任何 Worker 都可以选择通过使用传入的 Request 对象发出 fetch(request) 来调用注册在自定义域名上的 Worker。这意味着您可以在请求到达自定义域名 Worker 之前设置 Worker 运行。换句话说,您可以在同一请求中链接两个 Worker。
例如,考虑以下工作流:
api.example.com的自定义域名指向您的api-workerWorker。- 添加到
api.example.com/auth的路由指向您的auth-workerWorker。 - 对
api.example.com/auth的请求将触发您的auth-workerWorker。 - 在
auth-workerWorker 内使用fetch(request)将调用api-workerWorker,就像调用普通应用服务器一样。
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 中创建您自己的证书。有关说明,请参阅管理高级证书。
由于自定义域名需要精确的主机名匹配,绑定到 example.com 的 Worker 不会收到发送到 www.example.com 的请求,反之亦然。要使域名的两个版本都能工作,请设置重定向规则:
您还需要为要重定向来源的主机名设置代理 DNS 记录,以便 Cloudflare 应用重定向规则。
- 从 www 到根域名:为
www添加指向192.0.2.0的代理 DNSA记录,或指向100::的代理AAAA记录 - 从根域名到 www:为根域名添加指向
192.0.2.0的代理 DNSA记录,或指向100::的代理AAAA记录
如果您当前使用带有 /* 的路由调用 Worker,并且有指向 100:: 或类似地址的 CNAME 记录,建议使用自定义域名作为替代。
要迁移路由 example.com/*:
-
在 Cloudflare Dashboard 中,前往您域名的 DNS Records(DNS 记录) 页面。
Go to Records ↗ -
删除
example.com的 CNAME 记录。 -
前往 Account Home(账户主页) > Workers & Pages。
-
在 Overview(概览) 中,选择您的 Worker > Settings(设置) > Domains & Routes(域和路由)。
-
选择 Add(添加) > Custom domain(自定义域) 并添加
example.com。 -
删除位于 Worker > Settings(设置) > Domains & Routes(域和路由) 中的路由
example.com/*。
要在 Wrangler 配置文件 中迁移路由 example.com/*:
-
在 Cloudflare Dashboard 中,前往您域名的 DNS Records(DNS 记录) 页面。
Go to Records ↗ -
删除
example.com的 CNAME 记录。 -
将以下内容添加到 Wrangler 文件:
{ "routes": [ { "pattern": "example.com", "custom_domain": true } ] }[[routes]] pattern = "example.com" custom_domain = true -
运行
npx wrangler deploy以创建 Worker 将运行的自定义域名。