跳转到内容
搜索文档

路由

最后更新 查看 MarkdownAgent 设置

背景

Route 允许用户将 URL 模式映射到 Worker。当进入 Cloudflare 网络的请求与指定的 URL 模式匹配时,你的 Worker 将在该 Route 上执行。

Route 是一组针对请求 URL 进行评估的规则。如果你有一个始终需要通信的指定应用服务器,建议使用 Route。对传入的 Request 对象调用 fetch() 会向应用服务器触发子请求,具体由 Cloudflare zone 的 DNS 设置定义。

Route 会在应用服务器前面的现有已代理主机名上添加 Workers 功能。这使你的 Workers 能够充当代理,并在访问 Cloudflare 后面的应用服务器之前执行任何必要的工作。

Route 可与你在 Cloudflare DNS 中定义的应用程序配合使用

Route 可以 fetch() Custom Domains,如果在同一主机名上配置,则具有优先权。例如,如果你想在应用前面运行一个日志 Worker,可以在应用 Worker 上为 app.example.com 创建 Custom Domain,并为日志 Worker 在 app.example.com/* 创建 Route。调用 fetch() 将在 Custom Domain 上调用应用 Worker。请注意,Route 不能作为同一 zone 内 fetch() 调用的目标。

设置 Route

要添加 Route,你必须具备:

  1. 一个活动的 Cloudflare zone
  2. 要调用的 Worker。
  3. 为你要路由到的、由 Cloudflare 代理(也称为已开启橙色云)的域名子域名设置 DNS 记录。

如果你的 Worker 不是应用的源站,请按照以下说明设置 Route。

在仪表板中设置 Route

在设置 Route 之前,请确保已为你要路由到的域名子域名设置 DNS 记录。

要在仪表板中设置 Route:

  1. 在 Cloudflare 仪表板中,前往 Workers & Pages 页面。

    Go to Workers & Pages ↗
  2. 概览中,选择你的 Worker。

  3. 前往 Settings(设置) > Domains & Routes(域和路由) > Add(添加) > Route(路由)

  4. 选择 zone 并输入 Route 模式。

  5. 选择 Add route(添加路由)

在 Wrangler 配置文件中设置 Route

在设置 Route 之前,请确保已为你要路由到的域名子域名设置 DNS 记录。

要使用 Wrangler 配置文件 配置 Route,请参考以下示例。

{
	"routes": [
		{
			"pattern": "subdomain.example.com/*",
			"zone_name": "example.com"
		},
		// or
		{
			"pattern": "subdomain.example.com/*",
			"zone_id": "<YOUR_ZONE_ID>"
		}
	]
}
[[routes]]
pattern = "subdomain.example.com/*"
zone_name = "example.com"

[[routes]]
pattern = "subdomain.example.com/*"
zone_id = "<YOUR_ZONE_ID>"

在每个 Route 后添加 zone_namezone_id 选项。zone_namezone_id 选项可以互换。如果使用 zone_id,请按以下步骤查找 zone ID:

  1. 在 Cloudflare 仪表板中,前往 Zone 概览页面。

    Go to Overview ↗
  2. 概览左侧找到 Zone ID

要添加多个 Route:

{
	"routes": [
		{
			"pattern": "subdomain.example.com/*",
			"zone_name": "example.com"
		},
		{
			"pattern": "subdomain-two.example.com/example",
			"zone_id": "<YOUR_ZONE_ID>"
		}
	]
}
[[routes]]
pattern = "subdomain.example.com/*"
zone_name = "example.com"

[[routes]]
pattern = "subdomain-two.example.com/example"
zone_id = "<YOUR_ZONE_ID>"

匹配行为

Route 模式如下所示:

https://*.example.com/images/*

此模式将匹配所有发往 example.com 子主机且路径以 /images/ 为前缀的 HTTPS 请求。

匹配所有请求的模式如下所示:

*example.com/*

虽然它们看起来类似于正则表达式模式,但 Route 模式遵循特定规则:

  • 唯一支持的运算符是通配符(*),它匹配零个或多个任意字符。

  • Route 模式不能包含中缀通配符或查询参数。例如,example.com/*.jpgexample.com/?foo=* 都不是有效的 Route 模式。

  • 当多个 Route 模式可能匹配同一请求 URL 时,最具体的 Route 模式优先。例如,在匹配 https://www.example.com/ 的请求时,www.example.com/* 模式优先于 *.example.com/*。在匹配 example.com/hello/world 的请求时,example.com/hello/* 模式优先于 example.com/*

  • Route 模式匹配会考虑整个请求 URL,包括查询参数字符串。由于 Route 模式不能包含查询参数,要让 Route 模式匹配带有查询参数的 URL,唯一的方法是以通配符 * 结尾。

  • Route 模式的路径部分区分大小写,例如 example.com/Images/*example.com/images/* 是两个不同的 Route。

  • 对于 2023 年 10 月 15 日之前创建的 Route,Route 模式的主机部分区分大小写,例如 example.com/*Example.com/* 是两个不同的 Route。

  • 对于 2023 年 10 月 15 日及之后创建的 Route,Route 模式的主机部分不区分大小写,例如 example.com/*Example.com/* 是等效的 Route。

Route 可以在不关联 Worker 的情况下指定。这将抵消任何不太具体的模式。例如,考虑以下一对 Route 模式,一个有 Workers 脚本,一个没有:

*example.com/images/cat.png -> <no script>
*example.com/images/*       -> worker-script

在此示例中,所有发往 example.com 且路径以 /images/ 为前缀的请求都将路由到 worker-script /images/cat.png 除外,它将完全绕过 Workers。路径为 /images/cat.png?foo=bar 的请求将路由到 worker-script,因为存在查询字符串。

有效性

以下规则集决定 Route 模式的有效性。

Route 模式必须包含你的 zone

如果你的 zone 是 example.com,那么你可以拥有的最简单的 Route 模式是 example.com,它将匹配 http://example.com/https://example.com/,而不匹配其他任何内容。与 URL 一样,如果不指定路径,则隐含路径为 /

Route 模式不能包含任何查询参数

例如,https://example.com/?anything 不是有效的 Route 模式。

Route 模式可以选择以 http://https:// 开头

如果在 Route 模式中省略 scheme,它将同时匹配 http://https:// URL。如果包含 http://https://,则分别只匹配 HTTP 或 HTTPS 请求。

  • https://*.example.com/ 匹配 https://www.example.com/,但不匹配 http://www.example.com/

  • *.example.com/ 同时匹配 https://www.example.com/http://www.example.com/

主机名可以选择以 * 开头

如果 Route 模式的主机名以 * 开头,则匹配该主机及其所有子主机。如果 Route 模式的主机名以 *. 开头,则只匹配所有子主机。

  • *example.com/ 匹配 https://example.com/https://www.example.com/

  • *.example.com/ 匹配 https://www.example.com/,但不匹配 https://example.com/

以下示例说明了 *example.com/**.example.com/* 之间的区别:

Request URL *example.com/* *.example.com/*
https://example.com/ 匹配 不匹配
https://www.example.com/path 匹配 匹配
https://myexample.com/ 匹配 不匹配
https://not-example.com/ 不匹配 不匹配

路径可以选择以 * 结尾

如果 Route 模式的路径以 * 结尾,则匹配该路径的所有后缀。

  • https://example.com/path* 匹配 https://example.com/pathhttps://example.com/path2https://example.com/path/readme.txt

域名和子域名必须有 DNS 记录

所有域名和子域名都必须有 DNS 记录才能在 Cloudflare 上被代理并用于调用 Worker。例如,如果你想在 myname.example.com 上部署 Worker,并且已将 example.com 添加到 Cloudflare,但未为 myname.example.com 添加任何 DNS 记录,则对 myname.example.com 的任何请求都会导致 ERR_NAME_NOT_RESOLVED 错误。

这篇文档对您有帮助吗?