跳转到内容
搜索文档

排查 Rules 问题

最后更新 查看 MarkdownAgent 设置

重定向与其他 Cloudflare 产品之间的交互

你的重定向可能会干扰 Cloudflare 产品和功能(例如质询)。请考虑在规则表达式中排除 /cdn-cgi/* URI 路径,以避免问题。或者,你也可以仅排除子路径(例如 /cdn-cgi/challenge-platform/*),以避免与特定功能产生问题(在本例中为 Cloudflare 质询)。

你可能还希望排除多个验证服务使用的 /.well-known/* URL 路径。请参阅 重定向与 HTTP DCV 等验证流程之间的交互 了解更多信息。

Cloudflare 质询与 Rules 功能之间的交互

如果你对已启用一个或多个 Rules 功能的给定 URI 路径发出质询,则应在规则表达式中排除以 /cdn-cgi/challenge-platform/ 开头的 URI 路径,以避免质询循环。

例如,使用 and 运算符和 starts_with() 函数为规则定义复合表达式:

<OTHER_RULE_CONDITIONS> and not starts_with(http.request.uri, "/cdn-cgi/challenge-platform/")

重定向与 HTTP DCV 等验证流程之间的交互

验证流程中使用的路径(例如自定义主机名验证(Cloudflare for SaaS)、Pages 域名验证HTTP 域名控制验证 (DCV))可能会受到重定向的影响。

请考虑从规则中排除 /.well-known/* URI 路径,以避免问题。

响应中移除了 Content-Length 标头

Cloudflare 可能会从交付给网站访问者的响应中移除 Content-Length 标头。如果访问者必须收到 Content-Length 标头,请将源服务器配置为在响应中包含 cache-control: no-transform HTTP 标头。

此规则可能不适用于你的流量

如果你的规则表达式匹配的主机名既没有创建 DNS 记录,也没有启用通过 Cloudflare 代理流量,你将看到一个弹出窗口,其中包含几个选项:

  • 如果该主机名不存在 DNS 记录:是继续创建规则,还是为该主机名创建新的已代理 DNS 记录。
  • 如果该主机名存在 DNS 记录,但流量未通过代理:是继续创建规则,还是为现有 DNS 记录启用代理。

如果你选择创建新的 DNS 记录,新记录将带有 rules 标签以及以下关联注释:

Created during Cloudflare Rules deployment process for <RULE_NAME>

URL 重写会影响稍后执行的其他 Rules 功能

如果你使用 URL 重写 重写 URI 路径,这可能会影响稍后执行的其他 Rules 功能(例如 Origin Rules)——如果它们在筛选表达式中包含 URI 路径。

考虑以下 origin rule 配置:

  • 规则表达式:http.host == "example.com" and starts_with(http.request.uri.path, "/downloads/")
  • Host header(主机标头) > Rewrite to(重写为)assets.example.com

如果你配置具有以下配置的新 URL 重写:

  • 规则表达式:http.host == "example.com" and starts_with(http.request.uri.path, "/downloads/")
  • Path(路径) > Rewrite to(重写为) > Dynamic(动态)regex_replace(http.request.uri.path, "^/downloads/", "/")

origin rule 将不再匹配 /downloads/* 路径,因为 URL 重写在 Origin Rules 之前运行,URI 路径将从 "/downloads/" 重写为 "/"

解决方案

为防止出现这种情况,请在规则表达式中使用原始字段 (raw fields)。原始字段在整个请求评估工作流中是不可变的,并且不受先前匹配规则的操作影响。

在当前示例中,你可以在两条规则中使用 raw.http.request.uri.path 字段:

URL 重写

  • 规则表达式:http.host == "example.com" and starts_with(raw.http.request.uri.path, "/downloads/")
  • Path(路径) > Rewrite to(重写为) > Dynamic(动态)regex_replace(raw.http.request.uri.path, "^/downloads/", "/")

Origin rule

  • 规则表达式:http.host == "example.com" and starts_with(raw.http.request.uri.path, "/downloads/")
  • Host header(主机标头) > Rewrite to(重写为)assets.example.com

这样,两条规则将按预期工作。此外,即使第一条规则正在更新 URI 路径值,这也允许你在两条规则中使用相同的表达式。

有关原始字段列表,请参阅 Fields 参考

这篇文档对您有帮助吗?