了解如何将请求路由到分派 Worker。
你可以使用动态分派 Worker,将数百万个 vanity 域名或子域名路由到 Workers,而不会触及传统的路由限制。这些主机名可以是你管理域名下的子域名(例如 customer1.saas.com),也可以是由终端客户控制的 vanity 域名(例如 mystore.com),后者可通过自定义主机名进行管理。
在你的 SaaS 域名(你配置自定义主机名的域名)上配置通配符 Route(*/*),指向你的动态分派 Worker。这使你可以:
- 同时支持子域名和 vanity 域名:使用相同的路由逻辑处理
customer1.myplatform.com(子域名)和shop.customer.com(自定义主机名)。 - 避免路由限制:无需为每个域名创建单独路由(可能导致触及 Routes 限制),你可以在代码中处理路由逻辑,并将数百万个域名代理到各个 Workers。
- 以编程方式控制路由逻辑:编写自定义代码,根据主机名、自定义元数据、路径或任何其他属性路由请求。
若你希望将某些主机名排除在路由到分派 Worker 之外,可以:
- 添加不指定 Worker 的路由,以使某些主机名或路径不被分派 Worker 执行(例如,对于
saas.com、api.saas.com等) - 使用专用域名(例如
customers.saas.com)进行自定义主机名和分派 Worker 管理,使该域名的其余流量保持分离。
要使用通配符路由设置主机名路由:
- 配置自定义主机名:使用 Cloudflare for SaaS 设置你的域名和自定义主机名
- 设置回退源站:设置回退源站服务器,这是所有自定义主机名将路由到的位置。若你希望将它们路由到不同的源站,可以使用自定义源站服务器。请求在到达源站之前会经过 Worker。若 Worker 本身就是源站,则为回退源站放置一条虚拟 DNS 记录(例如
A 192.0.2.0)。 - 配置 DNS:通过 CNAME 记录指向 saas 域名 指向 DNS 记录(子域名或自定义主机名)。若你的客户需要代理其 apex 主机名(例如
example.com)且无法使用 CNAME 记录,请查看 Apex Proxying。 - 创建通配符路由:在你的平台域名(例如 saas.com)上添加
*/*路由,并将其与分派 Worker 关联。 - 实现分派逻辑:在分派 Worker 中添加逻辑,根据主机名、存储在 Workers KV 中的查找映射,或附加到自定义主机名的自定义元数据进行路由。
export default {
async fetch(request, env) {
const hostname = new URL(request.url).hostname;
// Get custom hostname metadata for routing decisions
const hostnameData = await env.KV.get(`hostname:${hostname}`, {
type: "json",
});
if (!hostnameData?.workerName) {
return new Response("Hostname not configured", { status: 404 });
}
// Route to the appropriate user Worker
const userWorker = env.DISPATCHER.get(hostnameData.workerName);
return await userWorker.fetch(request);
},
};若你只希望路由子域名记录(例如 customer1.saas.com),可以使用更具体的路由(*.saas.com/*)将请求路由到分派 Worker。
要设置子域名路由:
- 创建一条橙云通配符 DNS 记录:
*.saas.com,指向源站。若 Worker 本身就是源站,则可以使用虚拟 DNS 值(例如A 192.0.2.0)。 - 设置通配符路由:
*.saas.com/*,指向你的分派 Worker - 在分派 Worker 中添加逻辑,将子域名请求路由到正确的 Worker。
export default {
async fetch(request, env) {
const url = new URL(request.url);
const subdomain = url.hostname.split(".")[0];
// Route based on subdomain
if (subdomain && subdomain !== "saas") {
const userWorker = env.DISPATCHER.get(subdomain);
return await userWorker.fetch(request);
}
return new Response("Invalid subdomain", { status: 400 });
},
};当你的客户也在使用 Cloudflare,并通过 CNAME 将其自定义域名指向你的 SaaS 域名(例如 mystore.com → saas.com)时,Worker 路由行为取决于客户的 DNS 记录是代理(橙云)还是仅 DNS(灰云)。了解更多关于 O2O 设置
在使用特定主机名路由时,这可能导致不一致的行为:
- 若你根据 CNAME 目标(
saas.com)路由,自定义主机名的 DNS 记录必须为橙云,Worker 才会被调用。 - 若你根据自定义主机名(
mystore.com)路由,客户的记录必须为灰云,Worker 才会被调用。
由于你可能无法控制客户的 DNS 代理设置,我们建议使用 */* 通配符路由,以确保无论 DNS 如何配置,路由逻辑始终按预期工作。
下表显示了根据你的路由模式和客户的 DNS 代理设置,Worker 何时被调用:
| 路由模式 | 自定义主机名(橙云) | 自定义主机名(灰云) |
|---|---|---|
*/*(推荐) |
✅ | ✅ |
| 目标主机名路由 | ✅ | ❌ |
| 自定义主机名路由 | ❌ | ✅ |