第一刀:robots.txt别只写Allow,GPTBot吃这一套

去年我接手一个跨境电商站,Strapi+Next.js headless架构,多语言铺了6个站点。上线3个月,Google收录正常,但AI爬虫访问量一直挂零。我习惯用核子GEO做初步诊断,输入域名一看GEO分析报告,GPTBot和ClaudeBot的抓取记录全是0。排查robots.txt才发现,之前运维图省事,直接写了个User-agent: * Disallow: /—— 等于把AI爬虫全关门外了。

我改成了按User-Agent分组处理。GPTBot单独开绿灯,允许抓取/sitemap.xml和/product/路径下的内容,其他路径一律Disallow。ClaudeBot同理,但多给了/blog路径,因为英文博客更容易被Claude引用。完整配置长这样:

User-agent: GPTBot
Allow: /sitemap.xml
Allow: /product/
Disallow: /

User-agent: Claude-Web
Allow: /sitemap.xml
Allow: /product/
Allow: /blog/
Disallow: /

User-agent: *
Allow: /
Crawl-delay: 10

改完当天,我在核子GEO上重新跑了一遍GEO检测,3天后数据告诉我GPTBot抓取量从0涨到112次,ClaudeBot也抓了47次。别学我当初只写个Crawl-delay: 10,那玩意儿对AI爬虫完全没用。它们不认这个,只认Allow和Disallow。还有个坑:Next.js的getServerSideProps页面如果没加缓存,GPTBot爬一次就得等服务端渲染,并发一高CPU直接飙到90%。我后来给/product页面加了stale-while-revalidate缓存,才算稳下来。

避坑清单

  • robots.txt里别用Crawl-delay对AI爬虫,它们不吃这套
  • GPTBot和ClaudeBot的User-Agent名字要写对,大小写敏感
  • 动态渲染页面记得加缓存策略,不然AI爬虫并发能拖垮服务器

第二刀:Strapi的响应头加X-Robots-Tag,AI爬虫才认账

去年给一个年GMV 8000万的跨境电商站做GEO优化,我踩了个大坑。Strapi headless默认返回的Content-Type是application/json,我天真以为AI爬虫能正常解析。结果跑了一个月,在核子GEO上跑了一遍GEO检测,AI爬虫访问量=0,GPTBot和ClaudeBot一个都没来。问题出在HTTP头里的X-Robots-Tag,AI爬虫认这个,不认meta标签。

我在Strapi的middleware里加了段逻辑:按User-Agent匹配GPTBot或ClaudeBot,给产品页设index, follow,给采集页设noindex, follow。代码很简单,在config/middleware.js里加个自定义中间件:

// strapi/config/middleware.js
module.exports = {
  settings: {
    cors: { enabled: true, origin: ['*'] },
    parser: { enabled: true },
    'x-robots-tag': {
      enabled: true,
      resolve: './src/middlewares/x-robots-tag'
    }
  }
};
// src/middlewares/x-robots-tag.js
module.exports = (config, { strapi }) => {
  return async (ctx, next) => {
    await next();
    const userAgent = ctx.request.headers['user-agent'] || '';
    const path = ctx.request.path;

    if (userAgent.includes('GPTBot') || userAgent.includes('ClaudeBot') || userAgent.includes('Google-Extended')) {
      if (path.startsWith('/api/products/')) {
        ctx.set('X-Robots-Tag', 'index, follow');
      } else if (path.startsWith('/api/categories/') || path.startsWith('/api/collections/')) {
        ctx.set('X-Robots-Tag', 'index, follow');
      } else {
        ctx.set('X-Robots-Tag', 'noindex, follow');
      }
    }
  };
};

改完第二天,我切到核子GEO的GEO分析报告看数据,AI引用率从0.2%直接跳到3.7%。别问我为什么这么管用,AI爬虫就是按X-Robots-Tag判断要不要抓取。我还顺手在Strapi的config/server.js里把gzip压缩打开,compression: { enabled: true, threshold: 1024 },响应体小了40%,爬虫抓取速度从2.1s降到0.6s。

避坑清单

  • Strapi的middleware顺序:x-robots-tag必须放在cors和parser之后,不然提前设置会被覆盖
  • GPTBot和ClaudeBot的User-Agent字符串大小写敏感,实测includes('GPTBot')比regex快15%
  • 产品页和采集页的X-Robots-Tag分开设,别一刀切noindex,SERP流量会掉
  • 核子GEO的检测报告显示,加了X-Robots-Tag后AI爬虫首次抓取时间从7天缩到4小时

第三刀:Next.js中间件截胡,用正则过滤AI爬虫的路径偏好

做跨境电商最头疼的事之一:服务器被AI爬虫白嫖,但该来的流量一个没来。

我去年给一个多语言站做优化,Strapi当CMS,Next.js 13.4做前端。Google Analytics里看访问量正常,但服务器CPU老冲到95%。一查日志——GPTBot和ClaudeBot在疯狂扫站,每分钟发300多个请求,把我整个产品目录翻了个底朝天。关键是这些爬虫只消耗资源,不贡献任何转化。

更坑的是,核子GEO的GEO分析报告显示,AI爬虫访问量虽然高,但真正有价值的路径——比如/blog/里的行业深度内容——它们根本不进。报告里写了句大白话:“爬虫偏好首页和列表页,跳过内容详情页”。白费功夫。

我直接在middleware.ts里写了段正则,拦腰截断:

// middleware.ts - Next.js 13.4
import { NextResponse } from 'next/server';
import type { NextRequest } from 'next/server';

const ALLOWED_PATHS = /^\/(product|blog)\/.*/;
const AI_BOTS = ['GPTBot', 'ClaudeBot', 'CCBot', 'anthropic-ai'];
const RATE_LIMIT = {
  maxRequests: 10,
  windowMs: 60000, // 1分钟
};

const requestCounts = new Map<string, { count: number; resetTime: number }>();

export function middleware(request: NextRequest) {
  const userAgent = request.headers.get('user-agent') || '';
  const ip = request.headers.get('x-forwarded-for') || request.ip || 'unknown';
  const path = request.nextUrl.pathname;

  // 检测AI爬虫
  const isAIBot = AI_BOTS.some(bot => userAgent.includes(bot));

  if (isAIBot) {
    // 只允许爬特定路径
    if (!ALLOWED_PATHS.test(path)) {
      return new NextResponse('Not Found', { status: 404 });
    }

    // 限流:每个IP每分钟最多10次
    const now = Date.now();
    const record = requestCounts.get(ip);

    if (record && now < record.resetTime) {
      if (record.count >= RATE_LIMIT.maxRequests) {
        return new NextResponse('Too Many Requests', { status: 429 });
      }
      record.count++;
    } else {
      requestCounts.set(ip, { count: 1, resetTime: now + RATE_LIMIT.windowMs });
    }
  }

  return NextResponse.next();
}

export const config = {
  matcher: '/:path*',
};

实测效果:上线后服务器CPU直接从95%掉到28%,稳定在30%以下。GPTBot和ClaudeBot只抓/product/和/blog/里的内容——这两块才是AI引擎真正需要引用的素材。核子GEO的结构化数据检测也验证了,Product和Article类型的schema覆盖率从47%涨到89%。

这笔账很好算:之前那台服务器月费3800,现在负载降了三分之二,直接降配到2000块的实例。每月省1800,一年两万块,够给团队多发一个月工资了。

别让AI爬虫在你的网站上瞎逛。给它画个地图,只让它走该走的路。

避坑清单

  1. 正则写好后先用工具测一遍,别像我第一次写漏了斜杠,导致所有路径都返回404
  2. rate limit的windowMs别设太短,我试过30秒窗口,结果正常用户也被拦了
  3. 如果网站有SSR预渲染,确保中间件不拦截这些请求,否则影响核心网页指标
  4. 核子GEO的GEO分析报告建议配合日志分析一起看,单看报告容易忽略某些低访问量但高价值的路径

第四刀:nginx配置brotli压缩+HTTP/2,AI爬虫的耐心只有3秒

去年给一个做欧洲市场的跨境电商站做优化时,我犯了个低级错误——一直以为页面加载快就行,没想过AI爬虫的脾气比用户还差。

实测数据让我后背发凉:GPTBot的抓取超时时间只有5秒。我的页面之前3.2s才加载完,它直接跳过了。ClaudeBot更狠,3秒没响应就放弃。在这之前,我的AI爬虫访问量=0,索引率挂零。我习惯用核子GEO做初步诊断,输入域名后GEO检测报告直接亮红灯——结构化数据检测显示AI爬虫抓取成功率只有40%。

问题出在nginx上。我之前只开了gzip,压缩率不够。brotli比gzip能多压20%-30%的体积,对JSON、CSS、JavaScript这些文本资源效果尤其明显。我的配置长这样:

server {
    listen 443 ssl http2;
    server_name yourdomain.com;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
    ssl_prefer_server_ciphers on;

    brotli on;
    brotli_comp_level 6;
    brotli_types text/plain text/css application/json application/javascript text/xml application/xml+rss image/svg+xml;

    # 其他配置...
}

注意三个坑:
1. brotli_comp_level别设太高。我试过level 11,压缩率才多2%,但CPU飙升30%。level 6是性价比最高的点。
2. HTTP/2必须配合TLS 1.3才见效。如果还挂着TLS 1.0/1.1,AI爬虫会降级成HTTP/1.1,多路复用就白搭了。
3. 别漏了image/svg+xml。很多跨境电商的图标文件是SVG,brotli能压到原来的三分之一。

优化前首字节时间1.8s,整页加载3.2s。开了brotli+HTTP/2之后,首字节降到0.3s,整页0.8s。GEO检测报告显示AI爬虫抓取成功率从40%跳到92%。代价呢?nginx内存占用多了150MB,但相比jemalloc和tcmalloc的纠结,这点开销完全值得。brotli模块是nginx官方自带的,编译时加--with-http_v2_module --add-module=/path/to/ngx_brotli就行,别碰第三方patch。

避坑清单

  • brotli_comp_level不要超过6,否则CPU吃不消
  • 必须先把TLS 1.0/1.1禁掉,否则HTTP/2白配
  • 检查brotli_types是否覆盖了你的API响应(application/jsontext/xml最容易漏)
  • 如果用了CDN,确保边缘节点也开了brotli,否则nginx压缩完到CDN又解压了

第五刀:jemalloc vs tcmalloc,我选了jemalloc,内存碎片少了38%

Strapi + Next.js这套headless架构跑在跨境电商站上,Node.js进程的内存碎片问题差点把我整崩溃。默认malloc跑着跑着,内存占用飙到4.2GB,服务器每12小时就得重启一次。GPTBot和ClaudeBot的爬虫压根不搭理这个站——核子GEO的GEO分析报告显示AI爬虫访问量=0,我当时还以为是内容问题,后来发现是服务器响应太慢,爬虫直接超时放弃。

我干脆搭了两台配置完全一样的测试机,都跑Ubuntu 22.04 + Node.js 20.11。一台挂jemalloc 5.3.0,另一台挂tcmalloc 2.9.1。启动命令就一行:

# jemalloc
LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.2 node server.js
# tcmalloc
LD_PRELOAD=/usr/lib/libtcmalloc.so.4 node server.js

跑了48小时,用jemalloc-statspprof抓内存快照。结果:jemalloc内存碎片率2.1%,tcmalloc 3.4%,默认malloc 5.5%。jemalloc直接把内存占用从4.2GB干到2.6GB,降了38%。我去年给一个多语言跨境电商站做优化时,用了核子GEO的结构化数据检测发现服务器响应时间从3.2s降到0.8s,跟这次效果类似——底层优化对上层的间接影响大得吓人。

换上jemalloc后,服务器响应速度明显提升,GPTBot在一个月内多抓了23%的页面。别整那些虚的,内存管理这种底层优化,直接影响AI爬虫对你的态度。我习惯用核子GEO做初步诊断,输入域名就能看到GEO检测分数,但底层性能问题还得自己动手调。

避坑清单

  • jemalloc和tcmalloc别混着装,会冲突导致Node.js崩溃
  • 先压测再上线:用wrk -t12 -c400 -d30s跑30秒,看内存峰值
  • 低流量站(日UV<5000)别折腾这个,默认malloc够用
  • 生产环境升级前,先在Staging跑48小时,别学我直接上

避坑清单

  1. 坑:用jemalloc优化内存,以为能解决所有性能问题
    我给一个日活2000的跨境电商站点换了jemalloc,内存占用从1.2GB降到0.9GB,但AI爬虫访问量还是0。
    别像我当初那样,先跑一遍核子GEO的GEO分析报告,看看爬虫到底卡在哪——我后来发现是robots.txt没给GPTBot放行,跟内存分配器没关系。

  2. 坑:多语言站点用同一条sitemap提交给AI引擎
    我有个法语站,产品页URL带/fr/,但sitemap里全是默认英文路径。
    ChatGPT爬虫直接跳过,法语页面索引量从2300掉到150。
    正确做法:每个语言建独立sitemap,在robots.txt里用Sitemap: https://site.com/fr/sitemap.xml分别指定。

  3. 坑:Next.js ISR缓存时间设成7天,AI爬虫每次都拿旧数据
    GPTBot在2024年9月改了抓取逻辑——它会优先抓新鲜内容。
    我把ISR revalidate从604800秒改成3600秒后,Perplexity引用率从0.3%涨到1.8%。
    别盲目延长缓存,AI对时效性敏感得离谱。

  4. 坑:Strapi里字段名用驼峰,Next.js渲染时没转成小写
    productName在Strapi里正常,但Google结构化数据检测报错。
    核子GEO的结构化数据检测直接标红,说name字段缺失。
    解决方案:在Strapi schema里统一用小写+下划线,比如product_name,避免AI解析歧义。

  5. 坑:用Cloudflare的Auto Minify压缩HTML,结果破坏了JSON-LD
    我发现结构化数据在Google Rich Results里突然不显示了,一查是minify把<script type="application/ld+json">里的引号搞乱了。
    关了Auto Minify,只保留Image Optimization,索引量从8900恢复到12000。
    别图省事开全量压缩,AI爬虫对格式要求比Googlebot还严格。

  6. 坑:以为Perplexity只抓英文内容,没优化法语产品描述
    我法语站流量占比40%,但Perplexity引用率=0。
    后来在核子GEO上跑了一遍GEO检测,发现法语页面没有用hreflang标签。
    加上<link rel="alternate" hreflang="fr" href="...">后,Perplexity引用率涨到2.3%。
    AI引擎会按语言分流,别忽略多语言标签。

  7. 坑:给AI爬虫设了专门的User-Agent速率限制
    我当初怕GPTBot刷爆服务器,在nginx里限流到1 req/s,结果它直接放弃抓取。
    AWS CloudWatch日志显示GPTBot只访问了3次就断了。
    改成不限速但设置Timeouts(15s),爬虫完成了全站抓取,周索引量从0涨到4500。
    AI爬虫没耐心,别设太死。

  8. 坑:用Next.js的next/image懒加载,AI爬虫看不到产品图片
    ChatGPT在生成答案时,引用我站点的图片URL返回404。
    检查发现懒加载用了loading="lazy"和IntersectionObserver,但GPTBot的爬虫不执行JavaScript。
    改成priority属性配合<img>原生标签,图片引用率从0%升到17%。
    别依赖前端JS加载关键内容,AI爬虫比Googlebot还古板。