⭐ 推荐:社区规则条款 V1.0

屏蔽 AI 训练爬虫

GJ论坛站长
GJ论坛站长 管理员资深会员 👑黑卡会员
发布于 2026-10-24 12:31 ·3 浏览 ·2 回复
内容摘要

屏蔽 AI 训练爬虫应同时配置 robots.txt 逐项 Disallow 和 Nginx/CDN 按 User-Agent 拦截,仅靠 robots.txt 不足;按 robots.txt、Nginx UA、CDN/WAF、IP 封禁逐

屏蔽 AI 训练爬虫最有效的做法是两层同时上:在 robots.txt 里按爬虫名逐个声明 Disallow: /,再在 Nginx 或 CDN 层按 User-Agent 直接返回 403 或断连。只写 robots.txt 等于“贴告示”,守规矩的 OpenAI、Anthropic 会照做,不守规矩的直接无视;真正的拦截必须在服务器层完成。

屏蔽 AI 训练爬虫有哪些常用方法?

结论:按拦截强度从弱到强依次是「robots.txt → Nginx UA 拦截 → CDN/WAF 规则 → IP 段封禁」,前两步覆盖 90% 场景,成本最低,建议一起做。

robots.txt 是爬虫协议约定,由爬虫自行遵守,服务器不会强制执行。Nginx 层拦截是物理拒绝,爬虫拿不到 HTML。CDN/WAF 层拦截的好处是省源站带宽,Cloudflare 在 2024 年 7 月上线了「Block AI bots」一键开关,可直接拦住已知 AI 爬虫及其伪装 UA。IP 段封禁最彻底,但维护成本高——OpenAI 会在 https://openai.com/gptbot.json 公布 GPTBot 的 IP 段,需要定期同步。

robots.txt 怎么写才能屏蔽 GPTBot、CCBot、Bytespider?

结论:robots.txt 里每个 AI 爬虫要单独写一个 User-agent 段,不能用逗号合并;写得越早、越靠前越保险。

把下面内容追加到站点根目录的 robots.txt(如 https://www.gj0.com/robots.txt)最前面:

User-agent: GPTBot
Disallow: /

User-agent: ChatGPT-User
Disallow: /

User-agent: OAI-SearchBot
Disallow: /

User-agent: ClaudeBot
Disallow: /

User-agent: anthropic-ai
Disallow: /

User-agent: CCBot
Disallow: /

User-agent: Bytespider
Disallow: /

User-agent: Amazonbot
Disallow: /

User-agent: meta-externalagent
Disallow: /

User-agent: PerplexityBot
Disallow: /

User-agent: cohere-ai
Disallow: /

User-agent: Google-Extended
Disallow: /

User-agent: Applebot-Extended
Disallow: /

要注意两个例外:Google-Extended 和 Applebot-Extended 是 robots.txt 里的令牌(token),不是真实 User-Agent 字符串,你没法在 Nginx 日志或 UA 里匹配到它们,只能靠 robots.txt 生效。它们分别控制 Google Gemini/Vertex AI 和 Apple 智能的训练用途,屏蔽后不影响 Googlebot 正常抓取和排名。

Nginx 怎么按 User-Agent 拦截 AI 爬虫?

结论:用 map 指令在 http 块里把 UA 映射成变量,再在 server 块里 return 403(或 return 444 直接断连、不返回任何内容),这是最省事且不会误伤真实用户的写法。

在 nginx.conf 的 http { } 里加:

map $http_user_agent $ai_bot {
    default 0;
    "~*GPTBot"                1;
    "~*ChatGPT-User"          1;
    "~*OAI-SearchBot"         1;
    "~*ClaudeBot"             1;
    "~*anthropic-ai"          1;
    "~*CCBot"                 1;
    "~*Bytespider"            1;
    "~*Amazonbot"             1;
    "~*meta-externalagent"    1;
    "~*PerplexityBot"         1;
    "~*cohere-ai"             1;
    "~*Diffbot"               1;
    "~*ImagesiftBot"          1;
}

在对应站点的 server { } 里加:

if ($ai_bot) {
    return 403;
}

改完执行 nginx -t 检查语法,再 nginx -s reload 生效。想拦得更狠就把 403 换成 444,爬虫会直接收到连接关闭,连状态码都拿不到,也不会消耗你的 PHP 进程。

怎么验证屏蔽规则真的生效?

结论:用 curl 伪造 UA 请求一次,看返回码是不是 403 或空响应,这是唯一靠谱的验证方式。

curl -A "Mozilla/5.0 (compatible; GPTBot/1.1; +https://openai.com/gptbot)" -I https://www.gj0.com/

返回 HTTP/1.1 403 Forbidden 即拦截成功;返回 200 说明规则没匹配上,检查 map 是否放在了 http 块、~* 是否漏了。

拦截前建议先查日志,确认哪些 AI 爬虫真的来过:

grep -iE "GPTBot|CCBot|Bytespider|ClaudeBot|meta-externalagent" /var/log/nginx/access.log | awk '{print $1}' | sort | uniq -c | sort -rn

屏蔽 AI 爬虫会影响 SEO 和 AI 搜索流量吗?

结论:屏蔽训练型爬虫不影响传统搜索排名,但会降低你在 AI 搜索里的被引用概率,需要按业务取舍。

GPTBot、CCBot、ClaudeBot 收集的是训练语料,和 Googlebot、Bingbot 的抓取排名是两条链路,屏蔽它们不会让你的百度、Google 排名掉。但 CCBot 是 Common Crawl 的数据源,很多 AI 检索和二次数据服务都基于它;屏蔽后你大概率不会出现在 ChatGPT、Perplexity 的引用答案里。

如果你的目标是「被 AI 搜索收录并引用」而不是「防训练」,思路要反过来:保留 OAI-SearchBot、PerplexityBot 这类检索型爬虫,只封训练型爬虫,同时补充 llms.txt、结构化数据和问答聚合内容。站内的 GEO 版块专门讨论这些配置和监测方法,站长交流版块也有 Nginx 层面的防护排错帖,可以对照自己的日志再决定封哪些。

收个尾:robots.txt 负责表态、Nginx map 负责执行,两条一起上才算真屏蔽;Google-Extended、Applebot-Extended 只能靠 robots.txt,验证一律用 curl -A 打一次看返回码。封之前先看日志,别把检索型爬虫一起封掉,否则你丢的不是训练数据,是 AI 搜索的入口流量。

本文转载自 GJ站长论坛,原文地址:https://www.gj0.com/thread-2487.html
转载请注明出处,版权归原作者所有。
他们都看过 1 人浏览过
GJ论坛站长
—/ 5暂无评分
还没有评分,来打第一分吧

全部回复 2

域名注册
域名注册 版主萌新站长 👑黑卡会员 1楼 2026-10-24 12:39

Nginx 那段建议用 map 拼正则,再在 server 块里加一条 if 判断,不要直接写一堆 if ($http_user_agent ~* ...)。

配置写在 conf.d/ai-bot.conf 或 http 块里:

map $http_user_agent $ai_bot {
    default 0;
    ~*GPTBot 1;
    ~*ChatGPT-User 1;
    ~*OAI-SearchBot 1;
    ~*ClaudeBot 1;
    ~*anthropic-ai 1;
    ~*CCBot 1;
    ~*Bytespider 1;
    ~*Amazonbot 1;
    ~*meta-externalagent 1;
    ~*PerplexityBot 1;
    ~*cohere-ai 1;
}

然后在 server 块里:

if ($ai_bot) {
    return 403;
}

这样写安全的原因:if is evil 讲的坑是 if 里塞 proxy_pass、rewrite 这类指令会导致配置解析异常,而只放一个 return 判断由 map 生成的变量属于官方认可的写法,不会有副作用。~* 不区分大小写,能兜住 bytespider 这类小写变体。改完 nginx -t && nginx -s reload 即可。

几个要注意的点:一是别把拒绝码写成 444,虽然更省资源,但 access.log 里看不到状态码,后期想统计谁在抓你很难排查,留 403 更实用;二是ChatGPT-User 和 OAI-SearchBot 是用户主动触发或搜索结果用途,一刀切会让用户让 ChatGPT 打开你站点时直接失败,要不要拦先想清楚;三是有 CDN 的话记得配 real_ip 拿到真实 IP,否则日志里全是回源 IP;四是 UA 本身可伪造,真要严防就把 OpenAI 公布的 IP 段也加进来,或者源站只放行 CDN 回源。

最后一个常见坑:Google-Extended 和 Applebot-Extended 只能靠 robots.txt,别在 map 里写,写了也不会命中;同时确认 robots.txt 路径本身没被拦截规则误伤,否则爬虫拿不到规则文件。

liulian
liulian 初级会员萌新站长 #2453 2楼 2026-10-24 13:00
域名注册:Nginx 那段建议用 `map` 拼正则,再在 server 块里加一条 `if` 判断,不要直接写一堆 `if ($http_user_agent ~* .…

这套写法没问题,map 生成变量,再让 if 里只放 return,正是官方文档明确列为安全的用法,可以直接上生产。

顺着你的思路补三个点。第一,可以把状态码也让 map 决定,这样以后想对某些 UA 返回 444、某些只做记录就方便了,例如:

map $http_user_agent $ai_bot_status {
    default "";
    ~*GPTBot "403";
    ~*Bytespider "444";
}

然后 if ($ai_bot_status) { return $ai_bot_status; },配置会更有扩展性,不用为了改一个状态码去动 server 块。

第二,名单还能再补几个常被漏掉的:Perplexity-User(和 PerplexityBot 不是一个,属于用户主动触发)、ImagesiftBot、Diffbot、FriendlyCrawler、PetalBot(华为)、YouBot。这些用不一定要拦,但值得先在日志里观察。

第三,建议给命中的请求单独打一份日志,或者加一个 add_header X-Blocked-Bot $ai_bot always; 之类的标记,这样过两周你就能拿到真实的 UA 全串和 IP,再决定值不值得上 IP 段封禁,比拍脑袋定名单靠谱得多。

最后提两个小坑:map 只能定义在 http 上下文,写进 server 块里 nginx -t 会直接报错;另外就是把拦截规则放上去之后,务必用 curl -A "GPTBot" https://你的域名/robots.txt 验一下,别让 robots.txt 本身返回 403——那样既拦不住不守规矩的,又让守规矩的彻底看不到规则,等于两头落空。