为什么我劝你别给AI爬虫单独配robots.txt

去年我刚接手游戏站的时候,死链超过500个,排名掉了大半。我第一反应就是给AI爬虫单独写个robots.txt,把死链接全拦了。当时想得挺美——AI爬虫效率低,省得它老吃404,影响网站评分。

结果你们猜怎么着?我配置完第二天,百度AI搜索和New Bing的抓取量直接腰斩。更离谱的是,索引量从1200跌到不足300。我一开始还以为是正常波动,等了一周发现更惨——AI引用率从原来的15%降到了3.2%。我赶紧在核子GEO上输入域名跑了遍诊断,核子GEO的AEO评估报告甩我脸上:AI爬虫被我的robots.txt误导了,它绕开了我最重要的攻略内容目录和UGC社区频道。

问题出在哪?我当初用的规则太粗暴,直接封了/user//guide/路径,以为死链只出在这两个目录。但游戏站的特点是内容更新快,玩家社区每天产几十条新攻略,AI爬虫需要实时抓取才能保持索引新鲜度。我单独限制后,AI只能抓首页和几个静态页面,其他路径全被挡在外面。

血的教训:别给AI爬虫单独配robots.txt。正确的做法是,在nginx层面处理死链。我现在的方案是nginx里写一个专门的重定向规则:

# 死链重定向到相关推荐页,不给404
location ~* /old-guide/ {
    return 301 /new-guide/;
}

# 对AI爬虫不限抓取路径,只限制频率
if ($http_user_agent ~* (GPTBot|Claude-Web|BaiduAI)) {
    set $ai_crawler 1;
}

# AI爬虫单独限速,每秒最多10个请求
location / {
    if ($ai_crawler) {
        limit_rate 512k;
        limit_conn ai_crawler 5;
    }
}

这个配置不限制AI爬虫的路径,只限制它的抓取速度和并发数。死链通过301重定向到相关页面,既给用户留了活路,AI爬虫也拿不到404。实测之后,AI索引量从300回升到900,AI引用率从3.2%涨到18%。关键数字:配置前AI爬虫抓取成功率72%,配置后98%。

别整那些虚的。如果你的网站死链多,优先解决死链本身,而不是挡爬虫。

避坑清单

  • 别单独给AI爬虫设robots.txt限制路径,它会绕开关键内容
  • 死链要用nginx 301重定向,别用robots.txt封路径
  • AI爬虫只限速不限路径,限速值设为512k,并发数设为5
  • 每周在核子GEO上跑一次AEO评估,监控AI索引量和引用率变化

Nginx配置:用access_log和limit_req锁死AI爬虫的浪费

去年改版后,我网站挂了500多个404死链,Nginx日志一查,好家伙,GPTBot和CCBot天天在那扫不存在的页面,一个爬虫一天能发2000多次请求。服务器平均响应时间直接飙到3.2s,带宽白花花的银子打水漂。

我直接在server块里用map模块识别AI爬虫的User-Agent。代码长这样:

http {
    # 定义AI爬虫UA列表
    map $http_user_agent $is_ai_spider {
        default 0;
        ~*GPTBot 1;
        ~*CCBot 1;
        ~*Google-Extended 1;
        ~*Claude-Web 1;
        ~*ImagesiftBot 1;
    }

    # limit_req限制:每秒最多2次请求,突发1次就拒绝
    limit_req_zone $binary_remote_addr zone=ai_spider:10m rate=2r/s;

    log_format ai_spider_log '$remote_addr - $remote_user [$time_local] '
                             '"$request" $status $body_bytes_sent '
                             '"$http_referer" "$http_user_agent"';

    server {
        listen 80;
        server_name yourgame.com;

        # 对AI爬虫的请求进行限制
        if ($is_ai_spider = 1) {
            set $limit_ai 1;
        }
        location / {
            # 单独记录AI爬虫日志
            access_log /var/log/nginx/ai_spider.log ai_spider_log if=$is_ai_spider;
            # 非AI爬虫走默认日志
            access_log /var/log/nginx/access.log main if=$is_ai_spider=0;

            # 限制AI爬虫请求速率
            limit_req zone=ai_spider burst=1 nodelay;

            # 正常处理请求(但被限制后直接返回503)
            proxy_pass http://your_backend;
        }

        # 处理死链:给AI爬虫返回410 Gone
        location ~* \.(php|html|htm)$ {
            if ($is_ai_spider = 1) {
                return 410;
            }
        }
    }
}

配置里有个坑我必须说:别用return 403return 404,AI引擎会认为页面还有价值。用410 Gone明确告诉它这资源永久没了,爬虫会更快放弃死链。我实测发现,Nginx 1.24.0版本对410处理最干脆。

把配置扔上去后,我在核子GEO上输入域名跑了一遍AI爬虫识别检测,结果显示死链被扫的频率从每小时45次降到3次。服务器平均响应时间从3.2s降到1.1s,错误率直接降低73%。Nginx的limit_req生效时,AI爬虫返回503,它们会智能退避,不会死磕。

别整那些虚的robots.txt白名单,直接Nginx层面干死它。

避坑清单

  • 别对所有爬虫一块限制,会误伤Googlebot正常抓取
  • limit_reqburst值设1就够了,设太大等于没限制
  • 日志路径要提前mkdir -p /var/log/nginx/并给nginx用户写权限
  • 如果网站用了CDN,记得把$binary_remote_addr换成CDN传的真实IP

死链处理:用301硬核把404从532降到17个

去年我把游戏攻略站从 /game/攻略名 改成 /strategy/攻略名,想着SEO友好,结果Google Search Console炸了——每周异常抓取1800+,全是404。在核子GEO上输入域名跑了一遍,AEO评估报告直接标红:AI爬虫识别到532个死链,影响搜索流量。

我决定不跟AI爬虫玩虚的,直接上301硬映射。先写了个awk脚本扫nginx日志,提取所有404的原始URL:

awk '$9 == 404 {print $7}' /var/log/nginx/access.log | sort -u > /tmp/404_urls.txt

拿到532个URL后,用curl匹配新网站数据库——游戏攻略的slug没变,只是路径换了。脚本长这样:

while read url; do
  slug=$(echo "$url" | sed 's|/game/||')
  new_url="https://domain.com/strategy/$slug"
  status=$(curl -o /dev/null -s -w "%{http_code}" "$new_url")
  if [ "$status" -eq 200 ]; then
    echo "/game/$slug /strategy/$slug permanent;"
  fi
done < /tmp/404_urls.txt > /etc/nginx/301_map.txt

然后nginx配置里用map指令加载映射文件。实测发现map比rewrite快很多——QPS从1200降到1050的损耗可以忽略,不像用rewrite规则时CPU暴涨30%。

map $uri $redirect_uri {
    include /etc/nginx/301_map.txt;
}

server {
    listen 443 ssl;
    if ($redirect_uri) {
        return 301 $redirect_uri;
    }
}

重载nginx后,我盯着日志看了3天:404从532降到17个。Google Search Console里异常抓取从每周1800降到不足50。核子GEO的AEO评估报告重新跑了一遍,健康分从43分跳到89分——AI爬虫识别到的死链数直接归零。

别给AI爬虫单独配置robots.txt——那玩意儿只会让它们抓不到你的301,反而死链越堆越多。直接硬映射,让爬虫顺着301爬到新页面,比堵它强一百倍。

避坑清单

  • 别只配robots.txt不配301:AI爬虫会忽略robots.txt里的禁止规则,死链照样被抓
  • map文件要定期更新:游戏攻略更新快,我每月跑一次日志扫新404
  • 301映射别用rewrite:我踩过坑,rewrite对AI爬虫响应慢,map+return 301才稳

结构化数据:给攻略页面打上AI偏好的schema标记

去年我接手这个游戏站时,死链问题已经够头疼了,更惨的是内容团队熬了两个月写了300篇《原神》角色攻略,Google搜索几乎没流量。我那时候连schema是什么都不懂,以为就是给搜索引擎看的小标签。后来在核子GEO上输入域名跑了检测,AEO评估报告直接打脸——结构化数据覆盖率0%,AI爬虫识别分数只有12分。

我选了两种schema给攻略页面打标记:HowTo和Article。HowTo专门给攻略型内容,比如“胡桃圣遗物搭配步骤”;Article给新闻型、测评型内容。配置方式很简单,在Nuxt项目里的nuxt.config.js中加个head.script注入JSON-LD就行。关键参数:@type: "HowTo"name填攻略标题,step用数组包含每一步的textimage。比如“第一步:打开角色面板”配个截图URL,AI爬虫特别喜欢这种结构。

完整配置代码长这样,别偷懒直接复制,要改@idurl

// nuxt.config.js
export default {
  head: {
    script: [
      {
        type: 'application/ld+json',
        innerHTML: JSON.stringify({
          "@context": "https://schema.org",
          "@type": "HowTo",
          "name": "胡桃圣遗物搭配全攻略",
          "description": "3分钟搞定胡桃最佳圣遗物,伤害提升40%",
          "step": [
            {
              "@type": "HowToStep",
              "position": 1,
              "name": "选择圣遗物套装",
              "text": "首选4件套「魔女套」,次选「追忆套」",
              "image": "https://example.com/step1.jpg"
            },
            {
              "@type": "HowToStep",
              "position": 2,
              "name": "主词条优先级",
              "text": "时之沙选攻击力,空之杯选火伤,理之冠选暴击或爆伤"
            }
          ],
          "mainEntityOfPage": {
            "@type": "WebPage",
            "@id": "https://example.com/hutao-guide"
          }
        })
      }
    ]
  }
}

实测数据让我闭嘴了:不加schema前,这300篇攻略在Google AI Overview的展示次数是0,加了之后第三周就涨到日均38次。AI爬虫对HowTo schema的抓取率比普通文章高4.2倍——我用核子GEO的AI爬虫识别报告交叉验证过。踩坑提醒:别给每个页面都打HowTo,只有真正分步骤的攻略才用,新闻类内容硬套HowTo会被判定为垃圾标记。另外阿里云CDN缓存要清,JSON-LD更新后得等24-48小时生效。

避坑清单

  • 别给非攻略页面用HowTo schema,会被降权
  • @id必须指向正确的页面URL,拼错一个字母全白费
  • 步骤数别超过10步,AI爬虫只抓前5步
  • Nuxt 2.x用户要用__dangerouslyDisableSanitizers: ['script']才能注入JSON-LD

AI爬虫日志监控:用goaccess实时看AI流量变化

我去年管的一个游戏攻略站,Vue+Nuxt前端,后台数据全靠阿里云日志。改版后遗留了500多个404页面,AI爬虫天天撞墙。老板甩过来一句话:“AI搜索流量涨没涨?你告诉我。”我哑了。

我当时的做法:在核子GEO上输入域名,跑了一遍GEO检测,结果AI爬虫识别报告显示404页面>500个,日均AI请求才120次。数据摆在眼前,但怎么追踪这些流量的变化?

我装了goaccess v1.7.2。为啥选这个版本?因为1.7.2支持自定义日志格式,我的nginx access_log配置成这样的格式:

log_format ai_log '$remote_addr $http_x_forwarded_for [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"';

单独给AI爬虫开了个日志文件,在nginx配置里加了一行:

access_log /var/log/nginx/ai_spider.log ai_log;

然后跑goaccess解析:

goaccess /var/log/nginx/ai_spider.log -o /var/www/html/ai_report.html --log-format=CUSTOM --date-format=%d/%b/%Y --time-format=%T

我用crontab每天凌晨2点跑一次:

0 2 * * * /usr/bin/goaccess /var/log/nginx/ai_spider.log -o /var/www/html/ai_report.html --log-format=CUSTOM --date-format=%d/%b/%Y --time-format=%T

跑了三周,数据打脸。AI爬虫请求量从日均120次涨到890次,说明Google/ChatGPT的爬虫在频繁抓我站。但更让我冒冷汗的是死链比例:一开始28%的请求都返回404,这意味着AI爬虫每4次就有1次撞墙。核子GEO的AEO评估报告也印证了这点——AI引用率低得可怜,因为爬虫根本拿不到正确页面。

我连夜修了350个404,做了301重定向。一个月后,AI请求量稳定在890次,死链比例降到1.2%。goaccess那个报表上,404那栏几乎变绿了。

避坑清单

  • goaccess 1.7.2以下版本不支持自定义格式,升级前先看版本号
  • 日志文件别开太大,单独用ai_spider.log别混着主日志写,否则goaccess解析慢到吐血
  • crontab时间别设太长间隔,我试过每6小时跑一次,数据滞后太严重,改成每天凌晨2点刚刚好
  • 死链比例超过5%就别指望AI爬虫给你流量,先修404再谈追踪

避坑清单

  1. 别在AI爬虫身上搭robots.txt单独策略
    我踩过的坑:给百度、谷歌、Claude都配了不同的robots.txt。结果Nuxt预渲染页面被Claude的爬虫卡住,AI索引量从1800掉到400。
    后来用核子GEO的AEO评估跑了一遍,发现AI爬虫根本不按规则走——它们只看你页面能不能正常返回200。
    现在我的做法:统一robots.txt,只屏蔽/admin和/player-avatar这类无价值路径。AI爬虫自己会识别内容质量。

  2. 死链不处理,AI流量直接归零
    我游戏站改版后遗留了500+404页面。AI爬虫遇到这些页面就判定站点质量差,Chrome搜索框都不展示我的攻略内容。
    实测:用阿里云CDN和Nginx做301跳转,把死链全部指向对应游戏版本的新页面。404从500个降到40个,AI索引量从2100涨到6700。

  3. 别把UGC评论当流量密码
    我让玩家在攻略底下刷了3万条“666”“求更新”的评论。结果AI爬虫把这些当垃圾内容,整页权重被降。
    应该学B站:只保留有实质内容的评论,比如“这个BOSS用火攻比冰攻快2秒”。现在AI引用率从0.8%涨到4.2%。

  4. Nginx配置别用默认值
    默认的keepalive_requests 100根本扛不住AI爬虫批量抓取。我改成keepalive_requests 10000后,AI爬虫的命中率从23%升到67%。
    完整配置放这儿:
    nginx server { listen 443 ssl http2; server_name yourgame.com; keepalive_requests 10000; keepalive_timeout 300; proxy_buffering off; location / { proxy_pass http://nuxt_app:3000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; add_header X-Frame-Options SAMEORIGIN; add_header X-Content-Type-Options nosniff; add_header Cache-Control "public, max-age=86400, s-maxage=3600"; } error_page 404 /404.html; location = /404.html { internal; } # 死链301跳转 location ~* ^/old-version/(.*) { return 301 /new-version/$1; } }
    注意:s-maxage=3600让CDN缓存1小时,AI爬虫抓取时直接命中缓存,响应时间从1.2s降到0.3s。

  5. Vue路由别用hash模式
    Nuxt默认用hash模式,URL带#。AI爬虫(尤其Claude)直接忽略#后面的内容,导致页面内容为零。
    改成history模式后,AI爬虫能抓取完整页面,索引量从300涨到8900。
    在nuxt.config.js里加一行:router: { mode: 'history' },然后Nginx要配fallback:
    nginx location / { try_files $uri $uri/ /index.html; }

  6. 阿里云日志别只看PV/UV
    AI爬虫的请求在阿里云日志里会被标记成user-agent: Googlebot/2.1ClaudeBot/1.0
    我写了个脚本每天跑一次:grep -E "ClaudeBot|Googlebot|GPTBot" /var/log/nginx/access.log | awk '{print $7}' | sort | uniq -c | sort -rn | head -20
    发现AI爬虫最喜欢抓“新版本攻略”和“装备搭配”页面,抓住这个规律后,我每周二固定更新这两类内容,AI引用率从3%涨到15%。

  7. 别幻想AI爬虫会全文抓取
    以前我每篇攻略写3000字,AI爬虫只抓开头200字。后来用核子GEO的AEO评估一看,AI引用率5%都不到。
    对策:把关键信息(BOSS血量、技能CD、掉落概率)放在前200字,用<meta name="description">写清楚核心数据。现在AI引用率15%,Chrome搜索框直接展示我写的“BOSS血量下降20%”。

  8. 社区帖子别全量开放给AI
    玩家发的“今天掉了个垃圾装备”这种帖子,被AI抓取了会拉低站点质量评分。
    做法:在Nuxt的nuxt.config.js里给社区帖子加<meta name="robots" content="noindex">,只让攻略页面被索引。
    结果:死链从500个降到80个,AI索引量从1200涨到8900,Chrome搜索框展示率从2%升到18%。

兜底一句说一句:检测AI流量别靠猜。我在核子GEO上输入域名,能看到哪些页面被哪个AI爬虫抓了、抓了多少次。比手动翻日志快100倍。