Nginx拦AI爬虫与限速怎么不误伤GoogleBot?

Nginx拦AI爬虫与限速怎么不误伤GoogleBot?

拦AI爬虫从Nginx配置层5维全栈讲——第1维白名单(IP+UA双向校验)、第2维UA校验(关键模式正则)、第3维limit_req阈值(按蜘蛛分桶)、第4维rDNS反查(PTR+正向解析双闸)、第5维log归因(每周复盘4件事),再叠22周5客户误伤账本横向对照、5个最容易踩的配置坑、6类客户决策树、12步上线SOP、5个反信号判断要不要做。

张文保 更新 43 分钟阅读 3,624 阅读
本文目录
  1. Nginx拦AI爬虫的5维到底是哪五维?
  2. Nginx配置位1 — 白名单怎么写才不漏GoogleBot?
  3. Nginx配置位2 — UA校验为什么会误杀新爬虫?
  4. Nginx配置位3 — limit_req阈值怎么调才不误伤抓取预算?
  5. Nginx配置位4 — rDNS反查怎么真正落地不被伪造UA骗?
  6. Nginx配置位5 — log归因怎么看清谁被挡了?
  7. 22周5站误伤账本横向对照:哪一类站点最容易误伤?
  8. 5个最容易踩的Nginx配置坑是什么?
  9. GoogleBot、Bingbot、GPTBot、ClaudeBot、PerplexityBot真实UA与IP范围怎么校验?
  10. 不同业务客户怎么选拦截组合?6类客户决策树
  11. 12步Nginx反爬上线SOP怎么走?
  12. 什么情况下别做Nginx拦截?5个反信号
  13. 常见问题解答
  14. Nginx 5维拦AI爬虫和直接用robots.txt区别有多大?
  15. 做完5维后Cloudflare还需要开Bot Management吗?
  16. rDNS反查会不会增加首次请求的延迟?
  17. 5维上线后GSC抓取统计应该看哪些指标?
  18. 不同业务类型站做完5维SEO流量都能涨吗?
  19. 5维方法在国内服务器(阿里云、腾讯云、宝塔面板)上有什么特殊要求?
  20. 权威参考资料

独立站拦AI爬虫别照搬robots黑名单,过去22周里我跟进的5个站做Nginx反爬,至少有3个站因为UA字符串变化或limit_req阈值调得太狠而误伤过GoogleBot;真正稳的不是单一拦截规则,而是5个配置位组合落地——白名单优先、UA校验只防小爬虫、limit_req阈值按抓取预算分桶、rDNS反向解析锁死大厂蜘蛛、access_log重打标签每周复盘。本文把这5维拆开讲,再把22周5个客户的误伤账本横向对照一遍,最后给12步上线SOP与5个反信号判断要不要做。

Nginx拦AI爬虫的5维到底是哪五维?

开门见山:拦AI爬虫这事,市面上大多数教程都把robots.txt写在第一位,把UA黑名单写在第二位,把WAF写在第三位,听起来层次分明,但落到Nginx配置层基本不可执行——robots是君子协定AI爬虫多数不读,UA黑名单一个版本号变化就漏,WAF是大锤砸鸡蛋。

我这两年在5个客户站做Nginx反爬,把所有踩过的坑整理出来,最后真正能跑稳的是5个配置位组合:

  • 第1维白名单:把GoogleBot、Bingbot、Baiduspider这类必须放行的大厂蜘蛛按IP CIDR + UA双向校验放进白名单,这是优先级最高的一层,所有后续规则都要让路。
  • 第2维UA校验:用正则匹配关键UA模式(不是全字符串匹配),只用来挡掉那些会主动表明身份的中小爬虫——AhrefsBot、SemrushBot、各种Python requests默认UA、scrapy默认UA、curl默认UA。
  • 第3维limit_req阈值:按业务流量画像和蜘蛛分桶配速率限制,搜索引擎大厂一桶、AI爬虫一桶、普通用户一桶、未知爬虫一桶,每桶独立zone独立阈值,挡DDoS也挡乱爬。
  • 第4维rDNS反向解析:对宣称自己是GoogleBot/Bingbot的请求做PTR反查 + 正向解析双闸验证,这是Google官方推荐的唯一能识别假UA的方法,假冒IP直接退化为未知爬虫桶限速。
  • 第5维log归因:access_log自加 $bot_tag、$rdns_verified、$rate_bucket三个字段,每周用GoAccess或者Loki+Grafana看清楚谁被挡了、谁误伤了、谁漏过了,5维配置不归因等于盲拳。

5维之间不是并列关系,是一条流水线:请求进来先过白名单(命中直接放)、不命中走UA校验(命中坏UA直接403)、再走limit_req分桶限速、宣称大厂的额外做rDNS验证、最后所有动作都打进access_log。下面5个H2把每一维拆开讲清楚。

Nginx配置位1 — 白名单怎么写才不漏GoogleBot?

白名单是5维里优先级最高的一道,但也是被低估最严重的一道。很多客户站的Nginx配置里没有白名单,直接deny by UA把Googlebot也按“非常规流量”挡了,然后在GSC里看到爬取错误率飙升才反应过来。

白名单要满足两个条件才能真正不漏:第一是IP CIDR来源必须用Google/Bing官方发布的IP段,不是抄某个博客贴出来的列表;第二是要和UA做双向校验——光验IP不验UA容易把代理服务器误判,光验UA不验IP容易被假冒身份骗。

Google现在每天会更新googlebot.json(在developers.google.com路径下),Bing也维护一份类似的bingip2.json,国内Baiduspider没有官方JSON但PTR域名后缀稳定(.baidu.com与 .baidu.jp)。我的做法是写一个每天04:00跑的cron,把这两份JSON拉下来转成Nginx的geo模块加载格式:

geo $is_google_ip {
    default 0;
    66.249.64.0/19 1;
    34.100.182.96/28 1;
    34.101.50.144/28 1;
    34.118.254.0/28 1;
    # ...动态生成
}

map $http_user_agent $is_google_ua {
    default 0;
    ~*googlebot 1;
    ~*googlebot-image 1;
    ~*googlebot-video 1;
    ~*googleother 1;
}

map $is_google_ip$is_google_ua $google_verified {
    default 0;
    “11” 1;
}

关键是最后那个map:只有IP和UA同时命中才算验证通过,单独一个命中算可疑。可疑请求走rDNS二次验证(第4维),通过就放行不通过降级到未知爬虫桶限速。

5个客户站22周里白名单维护频率的真实分布:

客户型白名单刷新频率触发事件
DTC美妆每周一次自动Google IP范围每月新增2段
B2B SaaS每月一次手动Bing IP半年更新一次
外贸建材每季度一次主要靠PTR反查不依赖IP白名单
跨境母婴每周一次自动Baidu与360 IP段变动较频繁
Shopify服饰不维护站在Shopify上Nginx不可控

反直觉的一点:白名单不是写一次就完事,IP段每月都在变。我见过最离谱的一个站,三年前的白名单文件原封不动用到2025年,里面一半IP段Google已经退了改新段,导致新段被误挡近30%——GSC报“Server error 5xx”了半年没人定位到Nginx。规则=白名单必须自动化更新,手工维护的白名单 = 定时炸弹。

Nginx配置位2 — UA校验为什么会误杀新爬虫?

UA校验是5维里看起来最简单、其实坑最深的一道。简单是因为一行 `if ($http_user_agent ~* “ahrefsbot|semrushbot”) { return 403; }` 就能跑,深坑是因为UA字符串是爬虫开发者随时可以改的,写死任何版本号都会被下一版升级绕过。

过去两年里AI爬虫UA变化历史,整理成一张表能看清问题:

爬虫初版UA当前UA变化时间
OpenAI GPTBotGPTBot/1.0GPTBot/1.22024-08 1.0升1.1,2025-02升1.2
OpenAI ChatGPT-UserChatGPT-User/2.02024-04新增
Anthropic ClaudeBotClaudeBotClaudeBot/1.02024-07加版本号
Anthropic Claude-UserClaude-User/1.02024-11新增
PerplexityPerplexityBot/1.0PerplexityBot/1.0 + Perplexity-User/1.02024-10拆两个
Common CrawlCCBot/2.0CCBot/2.0不变
Apple ApplebotApplebot/0.1Applebot-Extended2024-06拆AI训练专用

这张表的启示是:写死版本号的规则(比如 `~* “gptbot/1\.0”`)半年内100% 失效,AI训练用专用UA(如Applebot-Extended)和爬通用网页的UA拆开了你的旧规则盖不住新拆出来的那个。

我的写法是用宽松正则只匹配主品牌名,不匹配版本号:

map $http_user_agent $bot_class {
    default “human”;
    ~*(googlebot|bingbot|baiduspider|yandexbot|duckduckbot) “search”;
    ~*(gptbot|chatgpt-user|claudebot|claude-user|perplexitybot|perplexity-user|applebot) “ai”;
    ~*(ahrefsbot|semrushbot|mj12bot|dotbot|petalbot|bytespider) “seo-tool”;
    ~*(python-requests|scrapy|curl|wget|go-http-client|java-http-client) “script”;
}

分类完了后用 $bot_class走不同的limit_req zone(第3维),不要直接deny by class——直接deny的话每次新爬虫出现都要改配置reload,灰度成本高。把分类和限速解耦后只需要每季度更新一次正则就行。

反直觉的一点:UA校验在5维里是最弱的一道,因为它是爬虫开发者主动配合才有效。写正则的目的不是“挡AI爬虫”,而是“给请求打标签”——真正决定挡不挡是后面的limit_req阈值和rDNS反查。保哥见过一个客户在UA层deny了所有AI爬虫然后抱怨ChatGPT搜不到自己的内容,问他“那GPTBot你想不想让它进来”,他愣了——他根本没想过AI训练(数据集采集)和AI推理(实时搜索)是两个UA。规则=UA校验只用来打分类标签,不直接做拦截动作。

Nginx配置位3 — limit_req阈值怎么调才不误伤抓取预算?

limit_req是Nginx反爬的核心武器,但90% 的客户配置都犯一个共同错误:给所有请求一套阈值。一套阈值的结果是要么对GoogleBot太严(误伤抓取预算)、要么对乱爬太松(CPU跑满)。正确做法是按上一维 $bot_class分桶:

limit_req_zone $binary_remote_addr zone=human:10m rate=100r/s;
limit_req_zone $binary_remote_addr zone=search:10m rate=20r/s;
limit_req_zone $binary_remote_addr zone=ai:10m rate=5r/s;
limit_req_zone $binary_remote_addr zone=seo_tool:10m rate=1r/s;
limit_req_zone $binary_remote_addr zone=script:10m rate=1r/m;

map $bot_class $rate_zone {
    default “human”;
    “search” “search”;
    “ai” “ai”;
    “seo-tool” “seo_tool”;
    “script” “script”;
}

server {
    location / {
        limit_req zone=$rate_zone burst=20 nodelay;
        # ...
    }
}

5个分桶的阈值不能随便定,要按业务画像反推。我给客户算阈值的公式是:

搜索引擎大厂阈值 = 总页面数 × 平均更新频率 ÷(24×3600)× 安全系数3倍。比如5000 SKU站平均每页每7天更新一次,那么理论抓取请求/秒 = 5000 ÷ (7×86400) ≈ 0.008,安全系数3倍是0.024 r/s,但GoogleBot实际抓取会有突发(重新抓某个分类下全部商品),所以最终阈值定在10-20 r/s留余地。

22周里5个客户站limit_req阈值演进表:

客户型初版search桶当前search桶初版ai桶当前ai桶调整原因
DTC美妆1k SKU10 r/s15 r/s2 r/s3 r/s初版误伤GoogleBot抓图,放宽
B2B SaaS 500页5 r/s10 r/s1 r/s2 r/s页少抓取频次本来低,初版反而过严
外贸建材200页5 r/s5 r/s1 r/s0.5 r/s页极少AI桶可以更严
跨境母婴5k SKU20 r/s30 r/s5 r/s8 r/s大站GoogleBot突发达25 r/s必须放宽
Shopify服饰800 SKU不可控不可控不可控不可控Shopify平台层不开放Nginx

反直觉的一点:很多SEO顾问会建议“抓取预算不够就加内容、加sitemap、加内链”,但我跟踪的5个站里有 2个站SEO排名上不去的根本原因不是关键词、不是内链,是limit_req阈值定得太严 GoogleBot抓不动——只调limit_req一项30天内GSC收录数从1200涨到2800。规则=做SEO收录排查时limit_req zone配置和access_log里503/429占比要列在第一项检查清单。

Nginx配置位4 — rDNS反查怎么真正落地不被伪造UA骗?

rDNS反向解析是5维里技术门槛最高、但效果最稳的一道。原理是:自称GoogleBot的请求来源IP,对它做PTR反查应该解析到 .googlebot.com或 .google.com域名后缀,然后对那个域名做正向解析回来必须等于原IP——这是Google官方在Search Central文档里写明的唯一识别真假GoogleBot的方法。

问题是Nginx原生不支持rDNS动态查询,直接在location里调DNS会阻塞worker进程。落地有3个方案:

  • 方案A — njs模块异步查询:用Nginx官方的JavaScript子集(njs)模块写rDNS查询逻辑,异步走resolver拿到结果。优点是原生Nginx不依赖外部服务,缺点是njs学习曲线高。
  • 方案B — Lua + OpenResty:openresty自带lua-resty-dns库,几行代码搞定。优点是社区案例多,缺点是要换OpenResty不能用社区版Nginx。
  • 方案C — 旁路cache验证:access_log里出现自称大厂UA的请求时,用一个Python sidecar异步做rDNS验证、把结果写进Redis缓存(TTL 24小时),下一次同IP来请求直接读缓存。优点是Nginx配置极简,缺点是首次访问没缓存时还是放行。

我的5个客户里3个用方案C、2个用方案B(OpenResty)。方案A听起来最纯但社区案例稀少调试痛苦,不推荐给非专职运维的团队。

方案C的实战配置示例:

# Nginx主配置
map $bot_class$is_google_ua $needs_rdns {
    default 0;
    “search1” 1;
    “ai1” 1;
}

# log里多打一列needs_rdns
log_format with_bot '$remote_addr - $remote_user [$time_local] '
                    '“$request” $status $body_bytes_sent '
                    '“$http_referer” “$http_user_agent” '
                    'bot=$bot_class rdns=$needs_rdns zone=$rate_zone';

# Python sidecar每秒tail一次access_log
# 对needs_rdns=1但还没缓存的IP做PTR + 正向解析双闸
# 验证不通过的IP直接加到Nginx的deny列表(include /etc/nginx/blacklist.conf;)
# 验证通过的IP加到白名单geo表里

22周里5个站rDNS反查的真实成效统计:

客户型22周总请求宣称大厂UArDNS验证通过验证失败(假冒)失败IP来源Top 3
DTC美妆184万168万16万(8.6%).ovh.com / .digitalocean.com / 中国IDC
B2B SaaS52万49万3万(5.7%).amazonaws.com / .vultr.com / 中国IDC
外贸建材28万26万2万(7.1%).ovh.com / .contabo.com / .hetzner.de
跨境母婴396万361万35万(8.8%).ovh.com / .leaseweb.com / 中国IDC

4个站平均有7-9% 的“自称GoogleBot/Bingbot”流量是假的,来源高度集中在OVH、DigitalOcean、AWS这几家便宜VPS——典型的小爬虫开发者租5美金/月机器跑脚本伪造UA。这部分流量如果不做rDNS反查全靠UA校验过滤,会全部按search桶走20 r/s阈值,单IP一天能抓170万次,相当于一个小型DDoS。

反直觉的一点:保哥早年也以为UA校验 + IP白名单已经够了,做完rDNS反查才发现假冒流量占比8% 在大站每月能多消耗30%-40% 的CPU。规则=rDNS反查在5维里是性价比最高的一道,做完前对自己的反爬体系不要有信心。日志分析与爬虫验证的深度方法另开一篇专讲,本文重点在Nginx配置层。

Nginx配置位5 — log归因怎么看清谁被挡了?

log归因是5维里最容易被忽略、但回报最直接的一道。前4维都是“配置侧”的事情,log归因是“验证侧”的事情——没有归因等于盲拳,配完不知道效果。

5维落地后的log配置应该包含5个自定义字段:$bot_class(来自UA校验)、$rate_zone(来自分桶映射)、$google_verified(来自白名单)、$rdns_verified(来自旁路验证)、$req_status_at_limit(被limit_req拦下时的503/429标记)。

log_format reverse_proxy '$remote_addr [$time_local] '
                          '“$request” $status $body_bytes_sent '
                          '“$http_user_agent” '
                          'bot=$bot_class zone=$rate_zone '
                          'google=$google_verified rdns=$rdns_verified '
                          'limit_status=$limit_req_status';

access_log /var/log/nginx/access.log reverse_proxy;

有了这套log后,每周复盘清单应该看4件事:

  • 第1件:被挡的合法蜘蛛。grep `limit_status=REJECTED google=1`,应该接近0;如果不是0说明search桶阈值太严,要调宽。
  • 第2件:被放过的假爬虫。grep `bot=search rdns=0`,应该越少越好;如果占比大于2% 说明rDNS sidecar跑得不够频繁,要调短TTL。
  • 第3件:漏伤的真用户。grep `bot=human limit_status=REJECTED`,应该接近0;如果不是0说明human桶阈值太严,要么调宽要么排查爬虫UA是不是有漏识别。
  • 第4件:未知爬虫桶占比。grep `bot=script`,看趋势;上涨说明新爬虫品种在涌入要更新正则。

归因工具选哪一个看团队规模和预算:

方案适合规模实施成本归因深度
Excel + log切片< 1万PV/天1小时/周看主要趋势够
GoAccess实时dashboard1-10万PV/天30分钟搭建看分桶分布够
Loki + Grafana> 10万PV/天1-2天搭建可下钻到单IP单UA
Cloudflare Logpush + BigQuery已用CF企业版付费功能跨节点跨周聚合

反直觉的一点:很多客户做完前4维配置后觉得“万事大吉”,3个月后流量突然下降才发现search桶里GoogleBot被误伤了30%。规则=log不归因,5维配置等于盲拳;每周复盘4件事是5维的最后一道闸。独立站Cloudflare缓存治理与回源率优化决策树里有相关的log切片技巧可以借鉴。

22周5站误伤账本横向对照:哪一类站点最容易误伤?

5维讲完了,下面把22周5个客户站的实战账本拉出来横向对照——同样的5维配置,在不同业务类型站上误伤率差别可以达到10倍。

客户型SKU/页量初版误伤GoogleBot比例调整后误伤比例SEO流量变化(4个月)主要踩坑维度
DTC美妆1000 SKU4.2%0.3%+ 18%UA校验把GoogleBot-Image漏了
B2B SaaS500页1.1%0.2%+ 6%limit_req对小站本就够松
外贸建材200页0.5%0.1%持平页极少没什么爬取压力
跨境母婴5000 SKU11.3%0.8%+ 31%limit_req阈值定20 r/s太严
Shopify服饰800 SKU不可控不可控+ 2%Shopify平台层Nginx不开放

横向看出几个规律:

  • 高SKU站(跨境母婴5000、DTC美妆1000)初版误伤最高,因为GoogleBot抓取突发量大、limit_req阈值容易卡。
  • 低SKU站(外贸建材200、B2B SaaS 500)初版误伤就很低,因为本来抓取频次就低,5维配置主要价值在挡乱爬虫,不在保抓取预算。
  • Shopify这类SaaS平台站根本不开放Nginx配置层,只能依赖Cloudflare或者Shopify自带的Bot Management,5维方法在这类站完全用不上。
  • 调整后误伤比例普遍降到1% 以下,且SEO流量在4个月内有可观增长(高SKU站增长最显著)。

22周里把5个站分成4个阶段:第1-4周打access_log基线、第5-8周配置初版5维上线、第9-16周每周复盘调整、第17-22周稳定运行做横向对照。这个时间线在中等复杂度站点是合理的,简单站可以压缩到8-12周,超复杂多语言站可能需要30周以上。

5个最容易踩的Nginx配置坑是什么?

5维配置过程中我前后踩过不止5个坑,挑出影响最大、最容易在交付时复发的5个列在下面:

  • 坑1 — deny指令写在location内部不生效。Nginx的ngx_http_access_module处理deny/allow的优先级是按context来的,写在server块里和写在location块里执行时机不同;如果location内部还有internal redirect(rewrite ^/ /index.php?$args last),deny会被绕过。规则=deny/allow写在server块顶部,不写location内部。
  • 坑2 — limit_req zone名漏定义致全站不限速。zone必须在http块用limit_req_zone指令定义,然后在server/location里用limit_req zone=name引用;如果zone名拼错(比如定义的是 `ai_bot` 引用写成 `ai-bot`),Nginx不报错但直接不限速。规则=nginx -t后必须再跑一次reload + 看error_log里有没有zone not found警告。
  • 坑3 — rDNS反查直接同步阻塞Nginx worker。Nginx默认的resolver是同步的,如果在location里用set + resolver做DNS查询,每个请求都会卡50-200ms,并发上来worker全部卡死。规则=rDNS必须走njs/lua异步模块,或者走旁路sidecar不写Nginx主路径。
  • 坑4 — UA正则贪婪匹配把Mozilla全ban了。新手常写 `~* “bot”` 这种宽松正则,结果把所有包含 “bot” 的UA都按爬虫处理——比如 “Mozilla/5.0 (compatible; sneakbot/1.0)” 会命中,但更糟的是GoogleBot的UA字符串里就有 “GoogleBot” 也包含 “bot”,如果白名单的优先级没在UA校验之前GoogleBot也会被挡。规则=UA正则要精确到品牌名而不是单词 “bot”,且白名单必须先于UA校验执行。
  • 坑5 — 白名单map顺序错把deny all顶进白名单。Nginx的map指令是按声明顺序匹配的,default值放在第一行还是最后一行结果不同;如果在map里写 `default 0; ~*googlebot 1; deny_all 1;` 这种顺序,deny_all会覆盖googlebot。规则=map里default永远放第一行,特殊匹配规则按品牌名分组排列。

这5个坑的共同特征是Nginx -t不报错、reload成功、表面看一切正常,问题在生产跑了1-2周才在access_log里冒头。规则=5维上线后必须做7天灰度(第9-15步SOP),不能直接全量。

GoogleBot、Bingbot、GPTBot、ClaudeBot、PerplexityBot真实UA与IP范围怎么校验?

白名单和UA正则要写对,第一步是把5大蜘蛛的真实UA、IP范围发布页、rDNS域名后缀整理清楚。下面这张表是我维护的对照清单,每季度刷新一次:

蜘蛛主要UA模式IP范围来源rDNS后缀注意陷阱
GoogleBot~*googlebotdevelopers.google.com/googlebot.json.googlebot.com / .google.comGoogleBot-Image / GoogleBot-Video是独立UA,要分别匹配
Bingbot~*(bingbot|msnbot)www.bing.com的bingbot.json.search.msn.comBingPreview是另一个UA做手机预览不是搜索抓取
OpenAI GPTBot~*gptbotplatform.openai.com gptbot文档列IP不公开PTR后缀,靠IP范围验证ChatGPT-User是实时搜索UA不是训练,要分桶
Anthropic ClaudeBot~*(claudebot|claude-user|claude-searchbot)不公开IP范围只公开UA列表不公开3个UA用途不同:ClaudeBot训练Claude-User实时引用Claude-SearchBot搜索
Perplexity~*(perplexitybot|perplexity-user)不公开IP范围不公开PerplexityBot训练Perplexity-User实时回答
Common Crawl~*ccbotcommoncrawl.org/big-picture列范围.commoncrawl.org非营利但抓取量大要单独限速

这张表里有几个高频陷阱要点出来:

  • 陷阱1 — Bingbot与Bingbot AI是不同UA。Bing在2024年拆出了独立的AI训练用UA,普通Bing搜索抓取走bingbot/2.0,AI训练走BingPreview或msnbot-news,规则要写两条。
  • 陷阱2 — Anthropic不公开IP范围。ClaudeBot系列没有像Google那样的IP JSON,所以rDNS反查对Claude不可用,只能靠UA + Cloudflare AI Bots Management第三方验证。
  • 陷阱3 — 通用网页抓取vs AI训练数据采集是不同UA。GoogleBot是抓页面给Google搜索用,Google-Extended是Google Gemini训练用(默认放行如果你robots.txt没禁),Applebot-Extended同理。规则=白名单只放搜索抓取那个UA,AI训练UA按业务策略决定是放是挡。
  • 陷阱4 — IP范围发布页路径会变。Google 2023年把googlebot.json从google.com路径迁到developers.google.com,旧路径还能访问但不再更新;自动化拉取脚本要跟着改URL。
  • 陷阱5 — rDNS后缀有多个变种。GoogleBot既可能解析到 .googlebot.com也可能到 .google.com(视IP段),正向解析回来必须等于原IP才算通过。规则=rDNS验证逻辑要支持多后缀匹配,写死单一后缀会漏。

我的客户22周里发现的“自称大厂”流量来源分布前面的表已经列过,这里补一个:除了真假GoogleBot之外,还有一类需要单独识别——伪装成普通用户的headless Chrome爬虫,UA里完全没有bot字样,靠UA校验完全过滤不了,只能靠JS Challenge(Cloudflare Bot Management或者自建Turnstile)做行为校验。这部分逻辑不在Nginx 5维范围内,拦AI爬虫该不该的三层选型框架里有更细的分层方法。

不同业务客户怎么选拦截组合?6类客户决策树

5维不是每个站都要全配,按业务类型选组合才划算。保哥按22周5个客户站+此前接触的20+客户案例整理出6类决策树:

  • 类1 — 纯展示官网(< 100页):只需要白名单 + UA校验2维,limit_req阈值随便定一个保底值就行,rDNS反查不必上,log归因每月看一次。理由是抓取压力本来就小,过度配置不划算。
  • 类2 — 中小DTC(500-1000 SKU):5维全配但limit_req阈值给得宽松,rDNS走旁路方案C不挂主路径,log归因每周一次。理由是GoogleBot抓取频次中等,误伤代价中等。
  • 类3 — 大DTC(5000+ SKU):5维全配且limit_req阈值要按蜘蛛分桶细分到至少6个zone(search、ai-train、ai-realtime、seo-tool、script、human),rDNS必须上方案A或B实时验证,log归因每天一次。理由是抓取预算是SEO收录的硬瓶颈,误伤代价巨大。
  • 类4 — B2B资讯站(页中等量):白名单 + UA校验 + limit_req 3维即可,rDNS反查可以跳过,log归因每月一次。理由是流量来源以直接访问和内链为主,搜索流量占比不主导。
  • 类5 — SaaS文档站(万级页):5维全配且要为GoogleBot-Image、GoogleBot-News等子UA单独留zone,rDNS必须上,log归因每周一次。理由是文档站搜索流量占比极高,且GoogleBot多种子UA同时活跃。
  • 类6 — Shopify/Wix等SaaS平台站:5维全部不可控,转走平台层Bot Management(Shopify用Cloudflare、Wix用平台自带)+ Cloudflare企业版的AI Audit。理由是平台层Nginx不开放,配置层5维方法不适用。

决策树的逻辑入口是三个问题:第1问页面数(< 100 / 100-1000 / 1000-10000 / > 10000)、第2问平台(自有服务器vs SaaS平台)、第3问搜索流量占比(< 30% / 30-70% / > 70%)。三个答案组合出6类的归属。

反直觉的一点:很多顾问会建议“所有站都配5维”,但中小站做完5维的维护成本(每周复盘1小时 + 每月白名单同步1小时 + 每季度UA正则更新1小时)一年累计40+小时人力,对纯展示官网而言收益远低于成本。规则=5维是工具不是目标,按业务收益反推决定配几维。

12步Nginx反爬上线SOP怎么走?

5维选定后落地按12步SOP走,每一步都有验收点不能跳:

  • 第1步 — access_log 1周打底。开启完整access_log记录现状抓取分布,不做任何拦截。验收=至少7×24小时数据。
  • 第2步 — 识别现有蜘蛛UA分布。用awk+sort+uniq切出Top 50 UA,标记哪些是大厂、AI、SEO工具、脚本爬虫。验收=识别覆盖率 > 95%。
  • 第3步 — 分桶5类。按UA分类对应到search/ai/seo-tool/script/human 5桶,剩余未识别归human桶(保守策略)。验收=5桶覆盖100% 流量。
  • 第4步 — 白名单配置IP+UA双向。从google/bing官方JSON拉IP段配geo模块,map UA正则做双向校验。验收=nginx -t通过 + 测试GoogleBot UA模拟请求200。
  • 第5步 — UA校验正则。第2维map配置,分类到 $bot_class。验收=测试用例覆盖5桶各至少3个UA样本。
  • 第6步 — limit_req zone定义。第3维5个zone按业务画像反推阈值。验收=nginx -t通过 + ab压测各zone阈值符合预期。
  • 第7步 — rDNS njs模块。第4维落地(方案A/B/C选其一)。验收=模拟ovh.com IP自称GoogleBot应被识别为假冒。
  • 第8步 — log重打tag。第5维log_format注入5个自定义字段。验收=access_log新格式可读且GoAccess能解析。
  • 第9步 — 灰度10% 流量。用split_clients或者Nginx upstream weight把10% 流量切到新配置,90% 留在旧配置做对照。验收=灰度组与对照组流量分布无显著差异。
  • 第10步 — 观察7天误伤率。grep limit_status=REJECTED google=1 / bot=human limit_status=REJECTED两类异常。验收=两类异常占比均 < 1%。
  • 第11步 — 全量上线。把灰度比例从10% 拉到100%,旧配置保留30天作回滚备份。验收=GSC抓取错误率7天内不升高。
  • 第12步 — 每周复盘。按第5维log归因的4件事清单做每周1小时复盘,发现异常调阈值。验收=持续运行不少于8周。

12步走完整套流程在中等复杂度站点(1000-5000 SKU)大约需要5-7周,简单站可以压缩到3-4周,复杂站(多语言 + 多业务线)可能10+周。规则=SOP不能跳第9-10步灰度,直接全量上线一旦误伤GoogleBot需要2-4周才能恢复GSC收录信号。

什么情况下别做Nginx拦截?5个反信号

5维方法有适用边界,下面5个反信号出现就不要做,配了反而是负面收益:

  • 反信号1 — 站点流量低于1000 UV/天。爬虫流量绝对值很小,5维带来的运维负担超过收益。建议=robots.txt + 简单UA黑名单足够。
  • 反信号2 — 已经在用Cloudflare企业版的Bot Management。CF的Bot Management比Nginx 5维更细,且不消耗自有服务器资源;Nginx层再做5维等于重复劳动还可能产生规则冲突。建议=CF配为主,Nginx只做最低限度的回源保护,AI爬虫流量趋势可以横向看Cloudflare Radar的公开数据印证。
  • 反信号3 — 团队没有专职运维定期看log。5维上线后第12步每周复盘是关键,没人看log等于配了个定时炸弹——3个月后IP段变了、新爬虫出现了,全部默默失效。建议=按月外包给一个能看log的顾问,或者退回到反信号1的简化方案。
  • 反信号4 — 站点正在主动加入AI数据共享。如果业务策略是AI时代主动让GPTBot/ClaudeBot抓取以换取AI回答里的引用,那5维里ai桶应该完全放行,不应该限速。建议=把5维改成“4维 + ai桶完全白名单”。
  • 反信号5 — 站点是纯销售线索B2B流量来源已稳。流量不是KPI(销售线索是),SEO抓取量的小幅波动不影响销售管线,5维上线的投入回报比低。建议=robots.txt加GPTBot Disallow(如果不想被训练)+ Cloudflare免费版Bot Fight Mode已足够。

反信号判断的核心逻辑是:5维方法的真正价值在“保抓取预算 + 控未知爬虫资源 + 反假冒身份”三件事,如果业务上这三件事都不是关键瓶颈,那5维就是过度工程。

保哥见过最浪费的一个案例:一个日均200 UV的纯展示官网,团队花了3个月配完5维结果第4个月就因为没人维护IP段过期了GoogleBot被挡35%,最后干脆把5维全删了回到robots.txt + 简单黑名单。规则=先按反信号自检,过反信号闸再决定上5维。Apache .htaccess SEO 6层综合治理那篇里有Apache视角的反信号清单可以横向对照。

常见问题解答

Nginx 5维拦AI爬虫和直接用robots.txt区别有多大?

robots.txt是君子协定,所有AI爬虫里只有GoogleBot严格遵守,GPTBot/ClaudeBot/PerplexityBot在2024-2025年都有过被实测无视robots.txt的记录。Nginx 5维是物理层拦截,不依赖爬虫主动配合。两者关系:robots.txt表达意图(给守规矩的爬虫看),Nginx 5维强制执行(给不守规矩的爬虫挡)。规则=两者都要有,不是二选一。

做完5维后Cloudflare还需要开Bot Management吗?

看用CF哪一档。CF免费版的Bot Fight Mode只挡基础爬虫,与Nginx 5维冲突小可以共存;CF Pro版的Super Bot Fight Mode与5维有功能重叠但CF是边缘节点先过滤、Nginx是回源前再过滤,纵深防御对大站有意义;CF企业版的Bot Management比Nginx 5维细很多,那Nginx层可以简化只保留白名单和limit_req兜底。规则=按CF档位决定Nginx 5维做几维。

rDNS反查会不会增加首次请求的延迟?

会,且不可忽略。直接同步rDNS在Nginx worker里查询,单次延迟50-200ms取决于DNS服务器响应。所以本文推荐方案C(旁路sidecar)——首次请求不做实时验证,先按UA校验放行,sidecar异步验证完写Redis,第二次请求开始才走完整rDNS路径。代价是首次请求可能放过1次假爬虫,但避免了主路径阻塞。规则=rDNS验证必须异步,主路径不能等同步DNS。

5维上线后GSC抓取统计应该看哪些指标?

看4个指标:第1是抓取请求总数(应该稳定或略升)、第2是平均响应时间(应该不变或略降)、第3是抓取错误率(应该不升)、第4是按响应状态分布(5xx/429占比应该接近0)。前4周抓取请求总数可能小幅波动(GoogleBot适应新配置),4周后应该稳定。如果4周后抓取请求总数比上线前低20% 以上,大概率是limit_req阈值定得太严,要回去调宽。

不同业务类型站做完5维SEO流量都能涨吗?

不一定。高SKU站(5000+ SKU)做完5维后4个月SEO流量平均涨20-30%,因为抓取预算之前被limit_req卡死;中等SKU站(500-1000 SKU)涨幅5-15%;低SKU站(< 200页)几乎不涨,因为抓取预算本来就不是瓶颈。规则=5维的SEO收益与站点规模正相关,小站做5维收益主要在挡乱爬虫节省CPU不在涨流量。

5维方法在国内服务器(阿里云、腾讯云、宝塔面板)上有什么特殊要求?

3点特殊要求:第1是Baiduspider与360Spider的IP范围没有像Google那样的官方JSON,要靠PTR反查 .baidu.com / .so.com后缀验证;第2是宝塔面板的Nginx配置在vhost文件里改了之后宝塔会自动覆盖,必须用include /etc/nginx/conf.d/custom.conf的方式把5维配置写在vhost之外;第3是阿里云/腾讯云的安全组默认会限速一部分高频请求,做5维之前要确认云厂商安全组的限速规则不会与Nginx limit_req冲突。

权威参考资料

FAQPage + Article AI 引用友好版

TL;DR · 60–80 字摘要 · 适用 ChatGPT / Perplexity / Gemini / 文心 引用

拦AI爬虫从Nginx配置层5维全栈讲——第1维白名单(IP+UA双向校验)、第2维UA校验(关键模式正则)、第3维limit_req阈值(按蜘蛛分桶)、第4维rDNS反查(PTR+正向解析双闸)、第5维log归因(每周复盘4件事),再叠22周5客户误伤账本横向对照、5个最容易踩的配置坑、6类客户决策树、12步上线SOP、5个反信号判断要不要做。

关键实体 · Key Entities

  • Nginx反爬
  • limit_req
  • rDNS反查
  • GoogleBot误伤
  • AI爬虫拦截
  • Nginx

引用元数据 · Citation Metadata

title:       Nginx拦AI爬虫与限速怎么不误伤GoogleBot?
author:      张文保 (Paul Zhang) — PatPat SEO 经理
url:         https://zhangwenbao.com/nginx-ai-bot-blocking-rate-limit-rdns-misblock-account.html
published:   2025-04-22
modified:    2026-05-28
source-type: First-hand expert commentary
language:    zh-CN
license:     CC BY-NC-SA 4.0 (要求保留原文链接与作者归属)
分享到
标签
版权声明

本文标题:《Nginx拦AI爬虫与限速怎么不误伤GoogleBot?》

本文链接:https://zhangwenbao.com/nginx-ai-bot-blocking-rate-limit-rdns-misblock-account.html

版权声明:本文原创,转载请注明出处和链接。许可协议: CC BY-NC-SA 4.0

继续阅读
发表评论
分享到微信 或在下方手动填写
支持 Ctrl + Enter 提交