跳转到内容
搜索文档

排查速率限制规则

最后更新 查看 MarkdownAgent 设置

部分 Workers 子请求被计为单独请求

Cloudflare 可能将同一 zone 上的 Workers 子请求计为单独请求,这会导致速率限制规则比预期更早触发。当速率限制规则配置为将 Also apply rate limiting to cached assets 设为 false 时,会发生此行为。

为防止此行为,您必须使用 cf.worker.upstream_zone 字段,从速率限制规则中排除来自同一 zone 的任何 Workers 子请求。例如,您可以在速率限制规则表达式中添加以下子表达式:

and (cf.worker.upstream_zone == "" or cf.worker.upstream_zone != "<YOUR_ZONE>")

第一个条件(测试空字符串)将匹配直接访问者请求,而第二个条件将匹配不来自您 zone 的子请求,从而有效地将同一 zone 的子请求从速率限制规则中排除。

带有主机名条件的速率限制规则与 Origin Rules

如果您使用 Origin Rules 重写 Host 标头,且速率限制规则的表达式或计数特征中包含 http.host,则规则可能匹配传入请求但未能递增其计数器。

这是因为速率限制规则表达式在两个阶段中进行评估:

  1. 请求阶段(规则匹配):表达式针对原始请求进行评估,其中 http.host 包含原始主机名。规则按预期匹配。
  2. 响应阶段(计数器递增):如果规则使用计数表达式,或已关闭 Also apply rate limiting to cached assets(同时对缓存资源应用速率限制),则计数器递增发生在响应之后。此时,Origin Rules 已将 Host 标头重写为新值,因此包含原始主机名的表达式不再匹配。

结果是,规则匹配请求但从不递增计数器,速率限制也从未执行。

解决方法

要修复此问题,请执行以下操作之一:

  • 从计数表达式中移除 http.host 条件,并使用其他字段(例如 http.request.uri.path)限定计数器范围。
  • 更新计数表达式以使用重写后的主机名,而非原始主机名。
  • 使用 or 条件将原始主机名和重写后的主机名都添加到计数表达式中。

速率限制故障开放行为

Cloudflare 速率限制规则在基础设施过载期间以故障开放模式运行(允许请求通过而非阻止它们)。当底层基础设施经历高负载时,Cloudflare 可能会跳过受影响请求的速率计数器更新和速率限制执行,而不是阻止合法流量。

故障开放事件没有客户可见的信号。如果速率限制规则未阻止本应捕获的流量(假阴性),且规则配置正确,则受影响数据中心的基础设施负载可能是一个因素。

按数据中心计数: 速率限制计数器按 Cloudflare 数据中心维护。分布在许多数据中心的流量可能使每个数据中心的速率低于阈值,即使聚合速率已超过阈值。为全球分布的流量设置阈值时请考虑这一点。

这篇文档对您有帮助吗?