简短回答: 网站挂在 Cloudflare 后面时,即使
robots.txt写着Allow: /,AI 爬虫也可能在边缘直接拿到 403。用curl -A "GPTBot"请求一次,再和普通浏览器 UA 对比就能看出来。我这个 zone 的原因是 Cloudflare 的 AI bot 设置(ai_bots_protection、ai_training: disallow、托管 robots.txt)。一个 API 请求关掉之后,我测的所有 AI 爬虫在一分钟内从 403 变成 200。
我写这个站,一部分目的是让人、以及人们去问的 AI 助手,能找到我做的东西。所以今天早上发现其中几个 AI 助手的爬虫从来没被放进来过,挺意外的。
我是怎么发现的?
我在检查 jqzdev.com 的搜索和 AI 回答可见度。robots.txt 已经是最宽松的写法:
User-agent: *
Allow: /
Sitemap: https://jqzdev.com/sitemap.xml
然后用几个爬虫的 UA 请求首页。现在每个域名我都会跑一遍这个检查:
for ua in "GPTBot/1.1" "ClaudeBot/1.0" "CCBot/2.0" "Bytespider" \
"PerplexityBot/1.0" "OAI-SearchBot/1.0" "Googlebot/2.1"; do
code=$(curl -s -o /dev/null -w '%{http_code}' \
-A "Mozilla/5.0 (compatible; $ua; +http://example.com)" https://jqzdev.com/)
echo "$ua $code"
done
2026-10-19 修复前的结果:
| User agent | 状态码 |
|---|---|
| GPTBot | 403 |
| ClaudeBot | 403 |
| CCBot | 403 |
| Bytespider | 403 |
| PerplexityBot | 200 |
| OAI-SearchBot | 200 |
| Googlebot | 200 |
403 的响应体是 Cloudflare 的 Your request was blocked.,带 server: cloudflare,没有 via: Caddy 头,说明请求根本没到我的源站。同一个 Cloudflare 账号下我的另外几个产品(vaneform.com、meetnewai.com、earlylore.com)同样测试都是 200,所以问题出在这个 zone 自己的设置上。
是什么在拦?
用 Cloudflare API 读 zone 的 bot 设置(GET /zones/<zone_id>/bot_management),差异很明显。jqzdev.com 上是:
{
"ai_bots_protection": "only_on_ad_pages",
"ai_training": "disallow",
"is_robots_txt_managed": true,
"bot_preference_sync_enabled": true
}
AI 爬虫能正常访问的 vaneform.com 上,ai_bots_protection 是 disabled,ai_training 是 disabled,is_robots_txt_managed 是 false。
我不清楚这些值是什么时候设上的,我没有主动选过。设置名看起来像是只对有广告的页面生效,但我的站没有广告,训练类爬虫照样被拦。这里只记录我观察到的现象,Cloudflare 内部怎么判断我并不知道。
怎么关掉?
在控制台里,到 zone 的 bot 设置里找 AI 爬虫相关的开关。用 API 的话一个请求:
curl -X PUT "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/bot_management" \
-H "Authorization: Bearer $CF_TOKEN" -H 'Content-Type: application/json' \
--data '{"enable_js":false,"fight_mode":false,"ai_bots_protection":"disabled",
"crawler_protection":"disabled","is_robots_txt_managed":false}'
改之前先把 GET 的结果存下来,方便回滚。关掉 ai_bots_protection 后,返回里的 ai_training 也变成了 disabled。大约 20 秒后再跑同一个 curl 循环,GPTBot、ClaudeBot、CCBot、Bytespider、anthropic-ai、meta-externalagent、Applebot-Extended 全部返回 200。
两点说明:
- 这是整个 zone 生效的。这个 zone 下所有子域名都会对这些爬虫放行。我的内部工具都在子域名上并且需要登录,爬虫只能看到登录页。
is_robots_txt_managed: false表示 Cloudflare 不再往你的robots.txt前面插它自己的规则,你的文件就是唯一的策略。
为什么不屏蔽 AI 爬虫?
对有些网站来说屏蔽是合理的选择。但对需要被发现的独立开发者,我认为默认屏蔽是错的:
- 用户问 AI 助手"有没有做 X 的免费工具"时,AI 依据的是它爬过的内容和实时抓取。页面返回 403,你就不在答案里。
- 搜索类抓取(PerplexityBot、OAI-SearchBot)本来就能访问,但训练类爬虫决定了模型在不实时搜索时"知道"你什么。
AI 爬虫真正的成本是负载。这是我在 Vaneform 上学到的,它是我做的免费网站流量查询工具。2026 年 10 月的某个三天窗口里,ClaudeBot 在那里发了约 156 万次请求,其中约 67% 打在一个批量对比页上,?q= 参数无限变化,每次都在源站渲染。
不屏蔽,怎么扛住负载?
在 Vaneform 上有效的做法,以及我手上的证据:
- 公开 HTML 走边缘缓存。 长
max-age,加stale-while-revalidate和stale-if-error,5xx 永远不缓存。2026-10-15 PerplexityBot 80 分钟内请求 13,765 次,ClaudeBot 同时 5,000 多次;4 小时约 3.4 万次请求,全部 200,0 个 5xx,延迟没有明显变化。 - 给爬虫一个更好的去处。 在被爬得最狠的页面底部加一个折叠的导航,链到排行榜、最新报告和指南,再用
llms.txt列出同样的内容。 - 关掉 Bot Fight Mode。 Cloudflare 免费计划里它没法豁免已验证的爬虫,会误伤 Bingbot 和 Googlebot。
- 别为了抓取压力加
Disallow。 去修那些无限 URL:缓存它们,或者别再链接它们。
没缓存的长尾页面仍然是风险:10 月有一晚 ClaudeBot 爬没缓存的报告页,查询平均慢到 3–4 秒,过去之后才恢复。缓存只能缓解,没法根治。
现在每个域名我都检查这些
robots.txt放行/,并写明 sitemap。- 上面的 curl 循环对每个爬虫都返回 200。
GET /zones/<id>/bot_management显示ai_bots_protection: disabled,Bot Fight Mode 关闭。- 公开 HTML 有边缘缓存头,错误页没有。
- 有
/llms.txt,指向值得读的页面。我的在 jqzdev.com/llms.txt。
想知道放开之后 AI 助手到底有没有给你带来访客,可以看 Vaneform 的这篇指南:如何衡量 AI 带来的流量。
常见问题
robots.txt 写了 Allow,AI 爬虫就一定能访问吗?
不一定。robots.txt 只是给守规矩的爬虫看的约定。网站前面的 CDN 或防火墙仍然可以在爬虫看到内容之前返回 403。要用爬虫的 UA 实际测一次。
Cloudflare 默认会拦 AI 爬虫吗?
我的 jqzdev.com 这个 zone 上,AI 训练类爬虫在我没主动设置的情况下被拦了,而同账号下更早的 zone 是放行的。别假设,去看你自己 zone 的 bot 设置。
放开 GPTBot 和 ClaudeBot 会拖慢网站吗?
如果爬虫打在源站渲染的页面上,会。Vaneform 上 ClaudeBot 三天约 156 万次请求。给公开 HTML 加边缘缓存和 stale-if-error 之后,后来一次 3.4 万请求的爆发全部返回 200。
用伪造 UA 测试靠谱吗?
它能说明边缘是否按 UA 拦截,而这些设置正是按 UA 判断的。真正的爬虫还来自固定的 IP 段,网站可能对它们有不同处理。真实流量要看 CDN 的 bot 分析。
jqz