# Cloudflare 拦截 AI 智能体：先修什么

Source: https://ipvolt.com/zh/blog/cloudflare-ai-agent-proxy-setup
Markdown: https://ipvolt.com/zh/blog/cloudflare-ai-agent-proxy-setup.md
Language: zh-CN

[ipvolt 首页](https://ipvolt.com/zh.md) / [博客](https://ipvolt.com/zh/blog.md) / Cloudflare 拦截 AI 智能体：先修什么

分析
发布于: 2026-09-14
更新于: 2026-09-14
作者： ipvolt
阅读约 3 分钟

诊断 AI 智能体任务中的 Cloudflare 故障，配置稳定的浏览器代理，并在 RAG 摄入之前拒绝验证页面或无效内容。

对于一项获准执行的浏览器智能体任务，先从**一个由提供商支持的稳定出口、一个浏览器上下文，以及提取之前的一道响应门控**开始。然后只更换故障真正指向的那个组件。代理认证问题需要修配置。目标站点的拒绝需要做访问决策。验证页面必须被挡在你的 RAG 语料库之外，即便它返回的是 HTTP 200。

这就是面对 Cloudflare 故障的抓取器、检索工作进程或浏览器智能体应有的实用配置。这里没有任何证据表明切换到住宅代理或移动代理能解决所有拦截。

**日期核对：2026 年 9 月 14 日。** Cloudflare 宣布的变更计划于 9 月 15 日生效。本文描述的是该公告和一套诊断工作流；它不报告已观察到的上线情况，也不能确定你当前错误的原因。

## 9 月 15 日会发生什么变化

Cloudflare 7 月的公告把 **Search、Agent 和 Training** 活动区分开。新接入的域名将默认在展示广告的页面上拦截 Training 和 Agent 活动，而 Search 仍然被允许。另外，把 Search 与 Training 结合在一起的爬虫将遵循最严格的适用规则，包括已有的 Training 拦截。广告页默认设置和混合用途分类是两项不同的变更。[Cloudflare 的原始公告](https://blog.cloudflare.com/content-independence-day-ai-options/)

该公司的新闻稿说明，广告页默认设置覆盖新客户、现有客户的新站点，以及**在 9 月 15 日之前没有改动过控制面板设置的**现有 Free 客户。「所有免费套餐站点」这种说法丢掉了这个限定条件。客户可以更改自己的设置。[Cloudflare 关于受影响客户群体的公告](https://www.cloudflare.com/press/press-releases/2026/cloudflare-allows-the-agentic-internet-to-flourish-with-a-simple-philosophy-your-content-your-rules/)

站点所有者可以为每个类别选择全站拦截、广告页拦截或 Allow。这些类别描述的是活动；你的浏览器库或 RAG 流水线的名称并不决定它的分类。Cloudflare 自行检测广告页，所以在浏览器里禁用广告下载并不能绕过策略。[AI bot 策略参考](https://developers.cloudflare.com/bots/additional-configurations/block-ai-bots/)

## 更换代理之前，先找出失败的那一跳

在检索记录中，把代理交互、目标站点导航和任何托管抓取 API 的响应分开保存。来自 `api.firecrawl.dev` 的 HTTP 402 和来自出版方的 HTTP 402 需要不同的处理。

单独一个 403 并不能指向 9 月 15 日的策略。Cloudflare 记录了多种可能的来源，包括源站权限和其他安全规则。`cf-ray` 有助于把请求与站点运营者的事件关联起来；它不会说明是哪条规则拒绝了请求。记录 UTC 时间戳、相关路径，以及可用时的 Ray ID。敏感的 URL 参数要保密。[403 的原因](https://developers.cloudflare.com/support/troubleshooting/http-status-codes/4xx-client-error/error-403/)、[Ray ID 诊断](https://developers.cloudflare.com/fundamentals/reference/cloudflare-ray-id/)

| 观察结果 | 下一步动作 | RAG 处理 |
| --- | --- | --- |
| 代理返回 407，或浏览器认证/连接错误 | 核实配置的网关、凭据和提供商账户。Chromium 可能把代理故障表现为导航异常。 | 标记检索不可用；保留原因。 |
| 目标站点返回 `cf-mitigated: challenge` | 调查该站点允许的访问途径和浏览器要求。停止自动重试验证。 | 隔离该响应，即使名义上是 200。 |
| 目标站点返回 403 且没有该验证信号 | 请站点运营者把请求与访问/安全规则关联起来；有条件时使用约定的 API、feed 或放行途径。 | 不可用；具体策略仍然未知。 |
| 来自已知一跳的 429 | 若提供了 `Retry-After` 则遵守；在受影响的范围内减少工作量，并为总重试预算设上限。 | 推迟检索；保留其新鲜度状态。 |
| 目标站点返回 402 | 检查出版方的付费/访问上下文和文档化的集成方式。 | 不可用，直到之后有一次被接受的抓取。 |
| Firecrawl API 返回 HTTP 402 | 检查 Firecrawl 的额度和计费配置。 | 除非另有报告，目标状态仍然未知。 |
| HTTP 200 但内容缺失、为空或不正确 | 检查渲染、必需的子资源和提取契约。 | 保留此前任何有效的文档；标记这次刷新失败。 |

验证响应头是 Cloudflare 记录在文档中的响应信号。没有这个响应头并不能确定内容可用。HTTP 407 指向代理认证；429 的计数范围由响应服务决定，所以更换出口并不能证明配额已重置。[验证检测](https://developers.cloudflare.com/cloudflare-challenges/challenge-types/challenge-pages/detect-response/)、[407 语义](https://www.rfc-editor.org/rfc/rfc9110.html#section-15.5.8)、[429 语义](https://www.rfc-editor.org/rfc/rfc6585#section-4)

对于托管版 Firecrawl，把外层 API 错误与返回的目标元数据和任务错误一起检查。其 API 错误目录把 402 描述为额度不足或缺少计费配置。其 scrape 响应可以单独携带 `data.metadata.statusCode`。这些字段在你的日志中必须保持分开。[Firecrawl 错误](https://docs.firecrawl.dev/api-reference/errors)、[scrape 响应契约](https://docs.firecrawl.dev/api-reference/endpoint/scrape)

## 完整浏览器任务的代理配置

对于有状态的工作流，在任务持续期间申请一个稳定出口，并在各个步骤中保留同一个浏览器上下文。提供商控制出口的亲和性；上下文保存 cookie 和浏览器存储。确认提供商的会话时长、重连行为以及出口提前失效时的替换策略。仅凭一个固定的网关地址无法证明这些属性中的任何一项。[会话连续性指南](/zh/guides/rotating-vs-sticky-proxies)说明了需要核实的内容。

当站点所有者允许某个固定地址时，经批准的固定地址是一个有用的起点。必需的地区可以成为使用区域出口的理由。对于其他工作负载，在相同的 URL 集合、账户、会话、地区和并发下比较候选路线。统计每次尝试文档中新鲜且有效的文档数，以及每个被接受文档的成本，包括重试和渲染流量。「住宅/移动」这个标签不足以用来选出胜者；[代理比较](/zh/blog/residential-vs-datacenter-proxies)介绍了这种评估。

把代理设置放在发起页面请求的地方：

| 技术栈 | 配置边界 | 会改变诊断结果的细节 |
| --- | --- | --- |
| Playwright | 向 `browser.newContext` 传入包含 `server`、`username` 和 `password` 的 `proxy` 对象，或在浏览器启动时配置。 | `httpCredentials` 是目标站点认证。单独的 Node/Python HTTP 客户端需要自己的配置。[Network 文档](https://playwright.dev/docs/network#http-proxy) |
| Puppeteer | 设置上下文的 `proxyServer`；在导航之前用 `page.authenticate` 提供代理用户名/密码。 | `proxyServer` 是一个端点字符串。新创建的页面也要配置。[上下文选项](https://pptr.dev/api/puppeteer.browsercontextoptions)、[认证](https://pptr.dev/api/puppeteer.page.authenticate) |
| Browser Use | 开源版浏览器接受 `Browser(proxy=ProxySettings(...))`。 | 使用 CDP 或托管浏览器时，核实远程浏览器的出口契约。本地设置并不能控制一个已经在运行的远程浏览器。[参数](https://docs.browser-use.com/open-source/customize/browser/all-parameters)、[远程浏览器](https://docs.browser-use.com/open-source/customize/browser/remote) |
| 托管版 Firecrawl | v2 scrape 的 `proxy` 字段可选 `basic`、`enhanced` 或 `auto`；默认为 `auto`。 | 这是一个托管策略选择器，不是自定义代理 URL。设置本地 `HTTP_PROXY` 不会配置远程的目标抓取。[Scrape API](https://docs.firecrawl.dev/api-reference/endpoint/scrape) |

把重试控制在同一个任务预算之内。托管服务的内部尝试，加上 SDK 的重试，再加上智能体的「再试一次」循环，会成倍放大工作量。遭到拒绝后，保留原因，并按上表选择下一步动作，然后再安排另一次尝试。

## 在提取之前运行响应门控

可下载的 Playwright 探测程序执行一次导航，对其主响应进行分类，并检查预期 CSS 选择器中是否有非空文本。它输出一小段 JSON 诊断信息，不包含目标 URL、正文、凭据或原始异常。它不提取也不摄入内容。

把 [probe.mjs](https://ipvolt.com/downloads/cloudflare-ai-agent/probe.mjs)、[package.json](https://ipvolt.com/downloads/cloudflare-ai-agent/package.json)、[package-lock.json](https://ipvolt.com/downloads/cloudflare-ai-agent/package-lock.json)、[test-fixture.mjs](https://ipvolt.com/downloads/cloudflare-ai-agent/test-fixture.mjs) 和 [README](https://ipvolt.com/downloads/cloudflare-ai-agent/README.md) 下载到同一个目录。使用 Node.js 22 或更高版本，运行 `npm ci`，然后运行 `npx playwright install chromium`。该包锁定了 Playwright 1.63.0。

通过你现有的配置/密钥机制注入以下设置，然后运行 `node probe.mjs`：

- `PROXY_SERVER`：不含凭据的 `http://` 网关 URL，不带路径或查询参数。
- `PROXY_USERNAME` 和 `PROXY_PASSWORD`：你的提供商凭据，连同任何文档规定的会话设置。
- `TARGET_URL`：你要检查的页面。
- `EXPECTED_SELECTOR`：一个具体的 CSS 选择器，例如 `main article[data-document-id]`，其匹配到的元素必须包含文本。

探测程序允许 15 秒用于导航，另有 5 秒用于内容检查。每次调用都会创建并关闭一个全新的上下文。对于多步骤的生产任务，保留任务的上下文，并对其相关响应应用同样的检查。[Playwright 配置指南](/zh/guides/playwright-proxy-setup)介绍了凭据和上下文配置。

这段分类代码在选择器检查之前运行：

```javascript
  if (result.cf_mitigated) return 'challenge';
  if (result.status === 402) return 'payment_or_access_review';
  if (result.status === 403) return 'access_review';
  if (result.status === 407) return 'proxy_auth_error';
  if (result.status === 429) return 'rate_limited';
  if (result.status >= 500 && result.status < 600) return 'upstream_error';
  if (result.status !== 200) return 'unexpected_status';
  if (!/^text\/html(?:\s*;|$)/i.test(headers['content-type'] ?? '')) return 'invalid_content';
  return null;
```

完整函数只在响应头等于 `challenge` 时才设置 `cf_mitigated`。这里返回 `null` 表示继续进行内容检查。最终的 `accepted_content` 结果要求 HTTP 200、HTML 且预期内容非空；它以退出码 0 结束。其他结果以退出码 2 结束。

在我们的 **18 次合成检查**中，所有预期结果都匹配：4 个响应通过了这道最小门控，14 个被拦下。一个状态为 200 且带有 `cf-mitigated: challenge` 的测试响应产生了 `outcome: challenge` 和退出码 2。预期内容缺失或为空同样失败。错误的代理凭据在两次认证质询之后暴露出 407 和 `proxy_auth_error`；没有任何请求被转发。有一个被接受的案例故意包含了一个失败的 403 子资源，用来展示主文档检查的局限。[确切的测试结果](https://ipvolt.com/downloads/cloudflare-ai-agent/example-output.json)

运行 `node test-fixture.mjs` 可以复现这套本地测试。它使用了 Node 26.8.1、Playwright 1.63.0 和 Chromium 153.0.8010.12，以及一个本地源站和一个需要认证的 HTTP 代理。安装命令和测试也用从本地 HTTP 服务器下载的完全相同的文件运行过。这些检查确定的是该探测程序在合成响应上的行为；它们不能确定真实的 Cloudflare 访问、提供商出口的稳定性或 HTTPS CONNECT 的行为。

把「接受」视为可以运行更深入校验的许可。宽泛的选择器可能匹配到登录页，而主 HTML 通过时某个必需的 JSON 子请求可能失败。在你的工作进程将要摄入的确切内容上校验文档身份、必需字段、语言区域和新鲜度。一次成功的探测不能为之后返回不同内容的抓取背书。刷新失败时保留上一份有效文档，并让消费者能看到其旧的检索时间。

## 当解决方案属于站点的访问规则时

如果目标站点由你运营，把命中的安全规则和它的 AI 爬虫策略放在一起检查。AI Crawl Control 中设为 Allow，仍然可能被更早执行的 WAF 规则覆盖。因此，AI 爬虫视图中缺少某个请求，也是去检查安全事件的一个理由。如果站点归另一个团队所有，共享请求标识符，并就预期的访问路径达成一致。[Cloudflare 的规则优先级](https://developers.cloudflare.com/ai-crawl-control/configuration/ai-crawl-control-with-waf/)

Pay Per Crawl 是一种单独的访问安排。其文档目前把它标为封闭测试；一个未付费的收费请求可能收到带 `crawler-price` 的 HTTP 402。付费请求需要文档规定的注册和签名付款意向流程。仅添加一个未签名的付款头是不够的，而且 WAF/Bot Management 拦截仍然可能阻止访问。要审慎地决定是否参与和预算多少，而不是让智能体把任何 402 都解释为可以花钱的授权。[Pay Per Crawl 范围](https://developers.cloudflare.com/ai-crawl-control/features/pay-per-crawl/what-is-pay-per-crawl/)、[请求协议](https://developers.cloudflare.com/ai-crawl-control/features/pay-per-crawl/use-pay-per-crawl-as-ai-owner/crawl-pages/)

你的流水线应当能够返回带原因和时间戳的「来源不可用」。这样，当仍然需要修复认证、由所有者批准规则变更或使用受支持的内容接口时，调用方也能得到一个可用的决定。

*方法：由 ipvolt 在 AI 辅助下撰写，并于 2026 年 9 月 14 日对照所链接的一手文档进行了核对。可下载的测试使用本地合成响应。它不衡量真实的 Cloudflare 拦截、代理提供商性能、HTTPS CONNECT 行为或 9 月 15 日的上线情况。*

ipvolt 仍在开发中。加入后，访问开放时只发一封邮件。没有别的。

[在 ipvolt 访问开放时获得通知](https://ipvolt.com/#waitlist-hero)。

## 参考来源

- [Cloudflare: Your site, your rules — new AI traffic options](https://blog.cloudflare.com/content-independence-day-ai-options/)
- [Cloudflare: September 15 announcement and existing Free customer scope](https://www.cloudflare.com/press/press-releases/2026/cloudflare-allows-the-agentic-internet-to-flourish-with-a-simple-philosophy-your-content-your-rules/)
- [Cloudflare: Block AI Bots](https://developers.cloudflare.com/bots/additional-configurations/block-ai-bots/)
- [Cloudflare: Detect a Challenge Page response](https://developers.cloudflare.com/cloudflare-challenges/challenge-types/challenge-pages/detect-response/)
- [Cloudflare: AI Crawl Control with WAF](https://developers.cloudflare.com/ai-crawl-control/configuration/ai-crawl-control-with-waf/)
- [Cloudflare: Error 403](https://developers.cloudflare.com/support/troubleshooting/http-status-codes/4xx-client-error/error-403/)
- [Cloudflare: Ray ID](https://developers.cloudflare.com/fundamentals/reference/cloudflare-ray-id/)
- [Cloudflare: What is Pay Per Crawl?](https://developers.cloudflare.com/ai-crawl-control/features/pay-per-crawl/what-is-pay-per-crawl/)
- [Cloudflare: Pay Per Crawl request protocol](https://developers.cloudflare.com/ai-crawl-control/features/pay-per-crawl/use-pay-per-crawl-as-ai-owner/crawl-pages/)
- [Playwright: HTTP proxy configuration](https://playwright.dev/docs/network#http-proxy)
- [Puppeteer: BrowserContextOptions](https://pptr.dev/api/puppeteer.browsercontextoptions)
- [Puppeteer: Page.authenticate](https://pptr.dev/api/puppeteer.page.authenticate)
- [Browser Use: Browser parameters](https://docs.browser-use.com/open-source/customize/browser/all-parameters)
- [Browser Use: Remote browser configuration](https://docs.browser-use.com/open-source/customize/browser/remote)
- [Firecrawl: Hosted v2 scrape API](https://docs.firecrawl.dev/api-reference/endpoint/scrape)
- [Firecrawl: API errors](https://docs.firecrawl.dev/api-reference/errors)
- [RFC 6585: HTTP 429](https://www.rfc-editor.org/rfc/rfc6585#section-4)
- [RFC 9110: Proxy authentication required](https://www.rfc-editor.org/rfc/rfc9110.html#section-15.5.8)

## 第一时间了解 ipvolt 开放体验。

顺便一提

ipvolt 仍在开发中。留下邮箱，开放体验时我们只会通知你一次。

开放体验时仅发一封通知邮件，不发送其他邮件。

[申请抢先体验](https://ipvolt.com/zh/blog/cloudflare-ai-agent-proxy-setup#waitlist-blog-end)

[隐私政策](https://ipvolt.com/privacy)


## 相关文章

- [MostLogin 代理设置：添加、测试与团队共享](https://ipvolt.com/zh/blog/mostlogin-proxy-setup.md) (分析, 2026年9月17日, 阅读约 2 分钟): 逐步在 MostLogin 浏览器配置文件中添加代理：协议、主机和端口、账号密码、IP 检测、团队权限、批量导入，以及最常见的出错原因。
- [Amazon 价格：你的报价与 Featured Offer](https://ipvolt.com/zh/blog/amazon-offer-vs-featured-offer.md) (分析, 2026年9月16日, 阅读约 2 分钟): 使用匹配的上下文、已知运费以及一个经过测试、能保留缺失数据的离线模型，把你的 Amazon 报价与 Featured Offer 进行比较。
- [Amazon 商品信息更新：已接受不等于已生效](https://ipvolt.com/zh/blog/amazon-listing-update-reconciliation.md) (分析, 2026年9月14日, 阅读约 2 分钟): 通过区分已提交属性、在售报价、库存与可购买状态来诊断已被接受的 Amazon 商品信息更新，并附一张实用的对账矩阵供参考。

## 相关指南

- [在 Playwright 中配置代理](https://ipvolt.com/zh/guides/playwright-proxy-setup.md): 为 Playwright 浏览器上下文设置带认证的 HTTP 代理，保持测试状态隔离，并将页面导航与子资源请求的故障分开诊断。
- [轮换代理与粘性代理：为会话连续性做好规划](https://ipvolt.com/zh/guides/rotating-vs-sticky-proxies.md): 围绕最小的完整工作流来选择轮换策略，区分出口 IP 绑定与 Cookie 状态，并测试粘性会话提前结束时你的应用应当如何处理。
- [不靠猜测修复代理错误 407](https://ipvolt.com/zh/guides/fix-proxy-error-407.md): 按可重复的顺序诊断 Proxy Authentication Required：网关、认证方式、凭据编码、账户范围和客户端配置。

## 关于 ipvolt

来自 ipvolt 团队的技术分析。

ipvolt 尚未开放使用。

[阅读英文原文](https://ipvolt.com/blog/cloudflare-ai-agent-proxy-setup.md)
