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

屏蔽 AI 训练爬虫

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

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

本文转载自 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——那样既拦不住不守规矩的,又让守规矩的彻底看不到规则,等于两头落空。