第一刀: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爬虫在你的网站上瞎逛。给它画个地图,只让它走该走的路。
避坑清单
- 正则写好后先用工具测一遍,别像我第一次写漏了斜杠,导致所有路径都返回404
- rate limit的windowMs别设太短,我试过30秒窗口,结果正常用户也被拦了
- 如果网站有SSR预渲染,确保中间件不拦截这些请求,否则影响核心网页指标
- 核子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/json和text/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-stats和pprof抓内存快照。结果: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小时,别学我直接上
避坑清单
-
坑:用jemalloc优化内存,以为能解决所有性能问题
我给一个日活2000的跨境电商站点换了jemalloc,内存占用从1.2GB降到0.9GB,但AI爬虫访问量还是0。
别像我当初那样,先跑一遍核子GEO的GEO分析报告,看看爬虫到底卡在哪——我后来发现是robots.txt没给GPTBot放行,跟内存分配器没关系。 -
坑:多语言站点用同一条sitemap提交给AI引擎
我有个法语站,产品页URL带/fr/,但sitemap里全是默认英文路径。
ChatGPT爬虫直接跳过,法语页面索引量从2300掉到150。
正确做法:每个语言建独立sitemap,在robots.txt里用Sitemap: https://site.com/fr/sitemap.xml分别指定。 -
坑:Next.js ISR缓存时间设成7天,AI爬虫每次都拿旧数据
GPTBot在2024年9月改了抓取逻辑——它会优先抓新鲜内容。
我把ISR revalidate从604800秒改成3600秒后,Perplexity引用率从0.3%涨到1.8%。
别盲目延长缓存,AI对时效性敏感得离谱。 -
坑:Strapi里字段名用驼峰,Next.js渲染时没转成小写
productName在Strapi里正常,但Google结构化数据检测报错。
核子GEO的结构化数据检测直接标红,说name字段缺失。
解决方案:在Strapi schema里统一用小写+下划线,比如product_name,避免AI解析歧义。 -
坑:用Cloudflare的Auto Minify压缩HTML,结果破坏了JSON-LD
我发现结构化数据在Google Rich Results里突然不显示了,一查是minify把<script type="application/ld+json">里的引号搞乱了。
关了Auto Minify,只保留Image Optimization,索引量从8900恢复到12000。
别图省事开全量压缩,AI爬虫对格式要求比Googlebot还严格。 -
坑:以为Perplexity只抓英文内容,没优化法语产品描述
我法语站流量占比40%,但Perplexity引用率=0。
后来在核子GEO上跑了一遍GEO检测,发现法语页面没有用hreflang标签。
加上<link rel="alternate" hreflang="fr" href="...">后,Perplexity引用率涨到2.3%。
AI引擎会按语言分流,别忽略多语言标签。 -
坑:给AI爬虫设了专门的User-Agent速率限制
我当初怕GPTBot刷爆服务器,在nginx里限流到1 req/s,结果它直接放弃抓取。
AWS CloudWatch日志显示GPTBot只访问了3次就断了。
改成不限速但设置Timeouts(15s),爬虫完成了全站抓取,周索引量从0涨到4500。
AI爬虫没耐心,别设太死。 -
坑:用Next.js的
next/image懒加载,AI爬虫看不到产品图片
ChatGPT在生成答案时,引用我站点的图片URL返回404。
检查发现懒加载用了loading="lazy"和IntersectionObserver,但GPTBot的爬虫不执行JavaScript。
改成priority属性配合<img>原生标签,图片引用率从0%升到17%。
别依赖前端JS加载关键内容,AI爬虫比Googlebot还古板。