Route 允许用户将 URL 模式映射到 Worker。当进入 Cloudflare 网络的请求与指定的 URL 模式匹配时,你的 Worker 将在该 Route 上执行。
Route 是一组针对请求 URL 进行评估的规则。如果你有一个始终需要通信的指定应用服务器,建议使用 Route。对传入的 Request 对象调用 fetch() 会向应用服务器触发子请求,具体由 Cloudflare zone 的 DNS 设置定义。
Route 会在应用服务器前面的现有已代理主机名上添加 Workers 功能。这使你的 Workers 能够充当代理,并在访问 Cloudflare 后面的应用服务器之前执行任何必要的工作。
Route 可以 fetch() Custom Domains,如果在同一主机名上配置,则具有优先权。例如,如果你想在应用前面运行一个日志 Worker,可以在应用 Worker 上为 app.example.com 创建 Custom Domain,并为日志 Worker 在 app.example.com/* 创建 Route。调用 fetch() 将在 Custom Domain 上调用应用 Worker。请注意,Route 不能作为同一 zone 内 fetch() 调用的目标。
要添加 Route,你必须具备:
- 一个活动的 Cloudflare zone。
- 要调用的 Worker。
- 为你要路由到的、由 Cloudflare 代理(也称为已开启橙色云)的域名或子域名设置 DNS 记录。
如果你的 Worker 不是应用的源站,请按照以下说明设置 Route。
在设置 Route 之前,请确保已为你要路由到的域名或子域名设置 DNS 记录。
要在仪表板中设置 Route:
-
在 Cloudflare 仪表板中,前往 Workers & Pages 页面。
Go to Workers & Pages ↗ -
在概览中,选择你的 Worker。
-
前往 Settings(设置) > Domains & Routes(域和路由) > Add(添加) > Route(路由)。
-
选择 zone 并输入 Route 模式。
-
选择 Add 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_name 或 zone_id 选项。zone_name 和 zone_id 选项可以互换。如果使用 zone_id,请按以下步骤查找 zone ID:
-
在 Cloudflare 仪表板中,前往 Zone 概览页面。
Go to Overview ↗ -
在概览左侧找到 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/*.jpg和example.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 模式的有效性。
如果你的 zone 是 example.com,那么你可以拥有的最简单的 Route 模式是 example.com,它将匹配 http://example.com/ 和 https://example.com/,而不匹配其他任何内容。与 URL 一样,如果不指定路径,则隐含路径为 /。
例如,https://example.com/?anything 不是有效的 Route 模式。
如果在 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/path、https://example.com/path2和https://example.com/path/readme.txt
所有域名和子域名都必须有 DNS 记录才能在 Cloudflare 上被代理并用于调用 Worker。例如,如果你想在 myname.example.com 上部署 Worker,并且已将 example.com 添加到 Cloudflare,但未为 myname.example.com 添加任何 DNS 记录,则对 myname.example.com 的任何请求都会导致 ERR_NAME_NOT_RESOLVED 错误。