Cloudflare 正在挡掉你的 AI 爬虫(GPTBot 全站 403、一份你没写过的 robots.txt,以及修法)
为什么 Cloudflare 在我的站点上拦截 AI 爬虫?
本月我们把 specmora.com 迁到 Cloudflare,随后发现所有 AI 爬虫——ClaudeBot、GPTBot、PerplexityBot、CCBot——在每个 URL 上都吃到 HTTP 403,而 Googlebot 和浏览器一路畅通。这篇讲清楚 Cloudflare 对新接入域名的默认策略到底做了什么、一个会把问题藏起来的测试误区,以及放行 AI 爬虫的确切步骤和 curl 验证命令。
如果你最近把站点接到 Cloudflare 后面,然后发现 AI 爬虫到处吃 403——这不是你配错了什么。从 2025 年 7 月起,Cloudflare 对新接入的域名默认拦截 AI 爬虫;它还可能往你的 robots.txt 顶部注入一段托管内容,让这些爬虫离开——哪怕你自己的规则写的是欢迎。我们很清楚这件事,因为本月它就发生在 specmora.com 上,而我们是靠卖 AI 可见度服务吃饭的。这篇文章包括:事故本身、Cloudflare 这个默认为什么情有可原、一个会让问题看起来”已修好”的测试陷阱,以及把门重新打开的确切步骤。
我们在自己站上发现了什么
2026 年 7 月,我们把 specmora.com 迁到 Cloudflare——普通的 DNS 迁移,没做任何花活。之后跑了一轮例行的爬虫访问检查,就是我们给客户跑的那套。结果每一个 AI 爬虫——ClaudeBot、GPTBot、ChatGPT-User、PerplexityBot、CCBot——都拿到 HTTP 403,页面写着 “Your request was blocked”。不是某几个 URL,是每一个 URL,包括 /llms.txt(一个纯粹为 AI 系统存在的文件)和 XML sitemap。与此同时 Googlebot 正常,Bingbot 正常,所有浏览器正常。
这个组合值得记住,它就是这类事故的指纹:人没事、传统搜索没事、AI 爬虫全体被关在墙外。表面上什么都没坏——流量分析不掉、没人报障、Search Console 一片绿。损失只发生在一个多数仪表盘根本不量的渠道上:AI 答案引擎到底还读不读得到你。而且这个 403 是在 Cloudflare 边缘发出的,请求根本没到源站,所以你自己的服务器日志里连被挡的记录都没有。证据只存在于 Cloudflare 的安全事件里,别处都看不见。
讽刺的地方我们自己也没放过:我们的白帽 GEO 服务页白纸黑字写着”CDN 可能正挡着你想要的爬虫”,是我们的标准审计项之一。然后我们自己的 CDN 在接入第一天就默认对我们干了这件事。
Cloudflare 为什么这么做——以及这个默认为什么站得住脚
这不是 bug,也值得被公平对待。2025 年 7 月 1 日,Cloudflare 把新接入域名的默认改成拦截 AI 爬虫,除非站长授权——它是第一家这么做的基础设施商,而它坐在很大一部分互联网前面。官方新闻稿把这叫许可制抓取:新客户会被问要不要放 AI 爬虫进来,而默认答案是不。
对多数站长来说,这个默认是对的。AI 训练爬虫消耗带宽、什么都不回馈;被抓走的内容会换个包装出现在别人的答案框里;而多数生意从”进训练语料”里得不到一个客户。如果这说的就是你,这篇可以关掉了——Cloudflare 已经替你做了明智的事。
问题出在无声的错配上。如果你获客的一部分方式,恰恰是被 ChatGPT、Perplexity、Claude 或 Google 的 AI 功能检索和引用——这正是 GEO 押的注,也越来越是普通 SEO 的一部分——那么一个为内容保护设计的默认,现在正在执行与你策略相反的事,而且没人通知你。被挡在边缘意味着你根本不在 AI 引擎挑选引用来源的候选集里。你可以有一套完美的服务端渲染 HTML——就是我们写过的、SPA 把内容藏起来那个问题的正解——但只要爬虫在第一个字节之前先吃了 403,这些就全都白搭。
一份你没写过的 robots.txt
403 只是我们发现的一半。Cloudflare 还往我们的 robots.txt 里注入了一段托管内容——插在我们自己的规则上面,同一个 URL。按 Cloudflare 的文档,当托管 robots.txt 开关打开、而站点本来就有自己的 robots.txt 时,Cloudflare 会把托管段前置,两者合并成一份响应。
托管段带着 Cloudflare 的 Content Signals——一行机器可读的声明,写着 ai-train=no——外加对指名 AI 爬虫的 Disallow: / 规则:GPTBot、ClaudeBot、CCBot、Google-Extended 等等。而我们自己的文件就在正下方,写的是 Allow。于是这份合并文件自相矛盾:上半截叫 GPTBot 走开,下半截请它进来。各家 robots.txt 解析器处理冲突的方式并不统一——有的合并分组,有的取先匹配到的——所以一份自相矛盾的文件意味着你的抓取政策取决于每个爬虫的解析器碰巧怎么判。那就不叫政策了。
两层东西、两种机制,得分清楚。托管 robots.txt 是劝告性的——它请守规矩的爬虫别进来。403 是强制性的——WAF 层面的拦截,连你 robots.txt 里欢迎的爬虫也照样挡。只修其中一个,结果要么是客客气气地发出邀请、客人却在门口被保安拦下;要么是撤了保安、门上却还贴着谢绝来访。
测试陷阱:裸 token 的 UA 会骗你
接下来是差点把我们自己都糊弄过去的部分,也是这篇文章里放确切命令的原因。
我们第一轮快速检查用的是裸 token 伪装 UA——curl -A "GPTBot"——结果全线 200。结论:爬虫没问题。然后跑完整检查,用每个爬虫真实发送的完整 UA 字符串,同样的 URL、同一分钟,全线 403。裸的 GPTBot 过了;含 compatible; GPTBot/1.2; 的真实字符串被拦。
想通了其实很平常:Cloudflare 拦的是真实爬虫的特征,手敲的裸 token 长得不像。但后果很阴险——偷懒的测法给出假阴性,告诉你门开着,而每一个真爬虫都在被拒之门外。如果这次事故只留一条操作教训,就是这条:永远不要用裸 token 测爬虫访问。用完整字符串,一字不差,从厂商自己的文档里抄。
修法,一步一步来
三步,全在 Cloudflare 控制台里,全部可逆。
第一步——放行指名的爬虫。 进你的域名,找到 AI Crawl Control,打开 Crawlers 标签页。每个已知 AI 爬虫都有一列 Actions,把你想放的设成 Allow。我们放行了 GPTBot、ChatGPT-User、OAI-SearchBot、ClaudeBot、Claude-User、Claude-SearchBot、PerplexityBot、Perplexity-User 和 CCBot。按文档说明,这里的拦截是以 WAF 自定义规则的形式落在你的域名上的——这正是它抢在 robots.txt 和源站之前生效的原因。逐个爬虫做决定:你完全可以放行检索和搜索类的爬虫(产出带链接引用的那些),同时继续拦纯训练用的爬虫。这个区分是正当的——它就是”被引用”和”被吃进语料”的区别。
第二步——关掉托管 robots.txt,或者跟它讲和。 控制台进 Security 设置,按 Bot traffic 筛选,把 “Set your preference to block training in robots.txt” 关掉,你自己的 robots.txt 就会原样提供。如果你确实想要 ai-train=no 这个信号,也可以留着——但那就得把你自己的规则和它前置的逐爬虫 Disallow 对齐,因为发布一份自相矛盾的文件,比两种政策的任何一种都糟。我们选择关掉,保留自己写的显式规则。
第三步——用完整 UA 字符串验证。 当前的字符串以厂商自己的文档为准(OpenAI、Perplexity、Common Crawl);Anthropic 文档里给了爬虫的名字但没给完整字符串,下面 ClaudeBot 那行是它在我们访问日志里实际发送的。版本号段会漂移(我们日志里是 GPTBot/1.2,OpenAI 文档现在列的是 1.4),所以抄文档里的现行版本,别抄这篇文章:
# GPTBot(OpenAI,训练爬虫)
curl -s -o /dev/null -w "%{http_code}\n" \
-A "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko); compatible; GPTBot/1.4; +https://openai.com/gptbot" \
https://www.specmora.com/
# ChatGPT-User(OpenAI,替 ChatGPT 用户实时抓取)
curl -s -o /dev/null -w "%{http_code}\n" \
-A "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko); compatible; ChatGPT-User/1.0; +https://openai.com/bot" \
https://www.specmora.com/
# ClaudeBot(Anthropic)
curl -s -o /dev/null -w "%{http_code}\n" \
-A "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)" \
https://www.specmora.com/
# PerplexityBot(Perplexity,搜索索引)
curl -s -o /dev/null -w "%{http_code}\n" \
-A "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; PerplexityBot/1.0; +https://perplexity.ai/perplexitybot)" \
https://www.specmora.com/
# CCBot(Common Crawl)
curl -s -o /dev/null -w "%{http_code}\n" \
-A "CCBot/2.0 (https://commoncrawl.org/faq/)" \
https://www.specmora.com/
每一行都应该打出 200。同一组命令再对你的 robots.txt 和 sitemap URL 跑一遍——在我们这次事故里,这两个也被挡了。然后确认 robots.txt 重新是你自己的:
curl -s https://www.specmora.com/robots.txt
如果你规则上方还压着一段你没写过的 Content Signals,说明第二步没生效。我们修完之后,五个爬虫在所有测试 URL 上都回到 200,robots.txt 也变回了仓库里那份。
主动做决定,别让默认替你决定
这次事故里最不舒服的真相是:双方都在做合理的事。Cloudflare 在保护它的中位数客户免受无偿抓取,中位数客户确实受益。但默认值就是套在没做选择的人头上的政策——如果 AI 答案是你的销售渠道之一,这条政策就在无声地跟你自己的利益作对,而且在你日常盯的每一个仪表盘上都看不见。
所以把这个决定拿回自己手里。AI 可见度对你的生意没意义,就留着拦截,白拿一层保护。有意义,就放行指名爬虫、拿回自己的 robots.txt、用真实 UA 字符串验证——然后记住,门打开只是管道。爬虫进来之后真正换得引用的,还是那套可抽取、有权威、答案前置的内容,从来没变过。两个答案都行。唯一错误的状态,是不知道你的 CDN 替你选了哪一个。
参考资料
- Content Independence Day: no AI crawl without compensation —— Cloudflare 2025 年 7 月 1 日的公告:新域名默认拦截 AI 爬虫(Cloudflare,2025)。
- Cloudflare Just Changed How AI Crawlers Scrape the Internet-at-Large —— 描述许可制抓取成为新默认的官方新闻稿(Cloudflare,2025)。
- AI Crawl Control —— Cloudflare 文档:监控 AI 爬虫流量、按爬虫设置放行或拦截规则(Cloudflare 文档)。
- Manage AI crawlers —— Crawlers 标签页、Allow/Block 操作、以及强制执行拦截的 WAF 自定义规则(Cloudflare 文档)。
- Managed robots.txt —— Cloudflare 如何把托管段(Content Signals 加逐爬虫 Disallow)前置到既有 robots.txt 之上,以及怎么关掉(Cloudflare 文档)。
- OpenAI 爬虫文档 —— GPTBot、ChatGPT-User、OAI-SearchBot 的官方完整 UA 字符串(OpenAI 文档)。
- Perplexity 爬虫文档 —— PerplexityBot、Perplexity-User 的官方完整 UA 字符串(Perplexity 文档)。
- Does Anthropic crawl data from the web? —— Anthropic 对 ClaudeBot、Claude-User、Claude-SearchBot 及其 robots.txt 行为的说明(Anthropic 帮助中心)。
- CCBot —— Common Crawl 公布的 UA 字符串(Common Crawl 文档)。
FAQ
常见问题
Cloudflare 为什么默认拦截 GPTBot 这些 AI 爬虫?
从 2025 年 7 月 1 日起,Cloudflare 对新接入的域名默认拦截 AI 爬虫,除非站长明确放行。这是刻意的产品决策,不是 bug——反爬立场本身合理,但它会悄悄套在那些恰恰需要 AI 可见度的站点上,而人眼看到的站点没有任何异常。
只改 robots.txt 能让 AI 爬虫进来吗?
不能。拦截发生在 Cloudflare 边缘,爬虫还没来得及读 robots.txt 就吃到 403——我们的 robots.txt 本身也被挡了。必须在 AI Crawl Control 里放行对应爬虫(或删掉那条 WAF 规则);robots.txt 只是给已经进得来的爬虫表达偏好。
为什么我用裸的 "GPTBot" 当 UA 测出来是 200,真爬虫却是 403?
Cloudflare 拦的是真实爬虫的特征。手敲的裸 token 不像真爬虫,所以放行了——这是假阴性。测试必须用厂商文档里的完整 UA 字符串,一字不差,包括 Mozilla/5.0 前缀和 compatible 那一段。
我到底该不该放行 AI 爬虫?
看 AI 可见度对你值不值钱。如果你的客户从来不经由 ChatGPT、Perplexity、AI 概览找到你,Cloudflare 的默认就是免费的反爬保护,留着挺好。如果 AI 答案是你的获客渠道之一,这个默认就在悄悄跟你的策略对着干,应该主动选择退出。