跳转到内容
搜索文档

主机名路由

最后更新 查看 MarkdownAgent 设置

了解如何将请求路由到分派 Worker。 你可以使用动态分派 Worker,将数百万个 vanity 域名或子域名路由到 Workers,而不会触及传统的路由限制。这些主机名可以是你管理域名下的子域名(例如 customer1.saas.com),也可以是由终端客户控制的 vanity 域名(例如 mystore.com),后者可通过自定义主机名进行管理。

(推荐)使用分派 Worker 的通配符路由

在你的 SaaS 域名(你配置自定义主机名的域名)上配置通配符 Route*/*),指向你的动态分派 Worker。这使你可以:

  • 同时支持子域名和 vanity 域名:使用相同的路由逻辑处理 customer1.myplatform.com(子域名)和 shop.customer.com(自定义主机名)。
  • 避免路由限制:无需为每个域名创建单独路由(可能导致触及 Routes 限制),你可以在代码中处理路由逻辑,并将数百万个域名代理到各个 Workers。
  • 以编程方式控制路由逻辑:编写自定义代码,根据主机名、自定义元数据、路径或任何其他属性路由请求。

若你希望将某些主机名排除在路由到分派 Worker 之外,可以:

  • 添加不指定 Worker 的路由,以使某些主机名或路径不被分派 Worker 执行(例如,对于 saas.comapi.saas.com 等)
  • 使用专用域名(例如 customers.saas.com)进行自定义主机名和分派 Worker 管理,使该域名的其余流量保持分离。

设置

要使用通配符路由设置主机名路由:

  1. 配置自定义主机名:使用 Cloudflare for SaaS 设置你的域名和自定义主机名
  2. 设置回退源站:设置回退源站服务器,这是所有自定义主机名将路由到的位置。若你希望将它们路由到不同的源站,可以使用自定义源站服务器。请求在到达源站之前会经过 Worker。若 Worker 本身就是源站,则为回退源站放置一条虚拟 DNS 记录(例如 A 192.0.2.0)。
  3. 配置 DNS:通过 CNAME 记录指向 saas 域名 指向 DNS 记录(子域名或自定义主机名)。若你的客户需要代理其 apex 主机名(例如 example.com)且无法使用 CNAME 记录,请查看 Apex Proxying
  4. 创建通配符路由:在你的平台域名(例如 saas.com)上添加 */* 路由,并将其与分派 Worker 关联。
  5. 实现分派逻辑:在分派 Worker 中添加逻辑,根据主机名、存储在 Workers KV 中的查找映射,或附加到自定义主机名的自定义元数据进行路由。

示例分派 Worker

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。

设置

要设置子域名路由:

  1. 创建一条橙云通配符 DNS 记录:*.saas.com,指向源站。若 Worker 本身就是源站,则可以使用虚拟 DNS 值(例如 A 192.0.2.0)。
  2. 设置通配符路由:*.saas.com/*,指向你的分派 Worker
  3. 在分派 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 });
	},
};

O2O 行为

当你的客户也在使用 Cloudflare,并通过 CNAME 将其自定义域名指向你的 SaaS 域名(例如 mystore.comsaas.com)时,Worker 路由行为取决于客户的 DNS 记录是代理(橙云)还是仅 DNS(灰云)。了解更多关于 O2O 设置

在使用特定主机名路由时,这可能导致不一致的行为:

  • 若你根据 CNAME 目标(saas.com)路由,自定义主机名的 DNS 记录必须为橙云,Worker 才会被调用。
  • 若你根据自定义主机名(mystore.com)路由,客户的记录必须为灰云,Worker 才会被调用。

由于你可能无法控制客户的 DNS 代理设置,我们建议使用 */* 通配符路由,以确保无论 DNS 如何配置,路由逻辑始终按预期工作。

不同路由配置与代理模式下的 Worker 调用

下表显示了根据你的路由模式和客户的 DNS 代理设置,Worker 何时被调用:

路由模式 自定义主机名(橙云) 自定义主机名(灰云)
*/*(推荐)
目标主机名路由
自定义主机名路由

这篇文档对您有帮助吗?