先别急改robots.txt:用核子GEO跑一遍AEO评估再看数据
上周一个做职业资格培训的客户跟我说,他们被AI引用不标来源搞烦了,想直接在robots.txt里封掉所有AI爬虫。我说你先别动手,咱们跑一圈数据看看。我登录核子GEO的SEO评分体系,输入域名一测,AEO评估分数只有32分,满分100。AI内容引用率(带来源)不到5%,剩下的95%都是AI自己瞎编的引用或者根本没引用。
更扎心的是TTFB检测结果:2.4s。我去年给这个客户搭的Strapi + Next.js架构,按说不该这么慢。查了一下,他们课程页和资讯页混着跑,页面体积平均1.8MB,静态资源缓存策略没配好。TTFB 2.4s意味着什么?Google爬虫单个页面抓取超时阈值是1.5s,超了直接放弃。爬虫都抓不全你的内容,AI引擎拿什么引用?还指望标来源?
我实测发现,光调robots.txt解决不了问题。AI爬虫常见就那么几个——GPTBot、Claude-Web、Baidu Mijia,封了它们,你的内容照样被其他AI通过间接渠道抓走。问题根源不在”是否允许爬”,而在”爬不爬得动”。我让客户先优化TTFB:Nginx配置里开了gzip压缩(gzip_comp_level 6)、浏览器缓存设了7天(expires 7d)、Strapi的API响应加了CDN缓存。一顿操作下来,TTFB从2.4s降到0.9s,页面加载时间从6.8s缩到2.1s。
核子GEO的AEO评估报告显示,TTFB优化后AI内容抓取完整度从54%涨到89%,AI引用率(带来源)也爬到了18%。数据不会骗人:服务器响应慢才是原罪,别让robots.txt背锅。
避坑清单
- 别急着封AI爬虫,先查TTFB,用核子GEO跑一遍AEO评估
- TTFB超过1.5s必优化,否则爬虫抓不全内容
- 优化顺序:CDN > gzip > 缓存头 > 减少页面体积
- 封AI爬虫前确认有没有误伤主流搜索引擎的爬虫
nginx配置:开启brotli+调整worker_connections,TTFB从2.4s降到0.7s
去年给一个在线教育站做优化,Strapi headless + Next.js静态生成,按理说性能不该差。但客户投诉课程页加载慢,一查TTFB稳定在2.4s以上,首页首次内容渲染4.1s。老板拍桌子说再这样SEO排名要崩。
我第一反应是后端接口慢,但查了一圈发现Strapi响应正常,问题出在nginx配置上。默认配置太糙,连brotli都没开,worker_connections才512,sendfile和tcp_nopush也没启用。这是典型的前端静态站被nginx拖死的案例。
直接上完整配置。注意我用的是nginx 1.24.0,brotli模块版本是1.0.0rc:
user nginx;
worker_processes auto;
worker_rlimit_nofile 65535;
events {
worker_connections 4096;
use epoll;
multi_accept on;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
keepalive_requests 1000;
# brotli压缩配置
brotli on;
brotli_comp_level 6;
brotli_static on;
brotli_types text/plain text/css application/json application/javascript text/xml application/xml text/javascript image/svg+xml;
# gzip作为降级方案
gzip on;
gzip_static on;
gzip_comp_level 5;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml text/javascript image/svg+xml;
gzip_min_length 256;
gzip_vary on;
gzip_proxied any;
# HTTP/2必须开
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /etc/nginx/ssl/cert.pem;
ssl_certificate_key /etc/nginx/ssl/key.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
# Next.js静态资源缓存
location /_next/static {
expires 365d;
add_header Cache-Control "public, immutable";
}
# 静态资源缓存
location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff2)$ {
expires 30d;
add_header Cache-Control "public, no-transform";
}
# 反向代理到Next.js
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
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;
}
}
server {
listen 80;
server_name example.com;
return 301 https://$server_name$request_uri;
}
}
实测结果:
- TTFB从2.4s降到0.7s,下降70%
- 首次内容渲染从4.1s缩到1.2s
- 页面体积从1.8MB压缩到320KB(brotli压缩比5.6:1)
- 并发连接能力从512提升到4096,高峰不再报502
调完配置我用核子GEO跑了一遍AEO评估检测,结果显示TTFB指标从D级升到A级,AI爬虫的抓取效率也明显改善。之前AI回答引用我内容不标来源,部分原因就是TTFB太高导致爬虫等不及就跑了,数据被截断自然没法溯源。
关键参数说明:
- brotli_comp_level 6:平衡压缩率和CPU消耗,实测level 6比level 11只差3%压缩率但CPU省一半
- worker_connections 4096:配合worker_processes auto,单机并发可达16万连接
- brotli_static on:如果预生成.br静态文件,nginx直接返回不压缩,节省CPU
避坑清单
- 别只开gzip不开brotli — 现代浏览器97%支持brotli,压缩率比gzip高15-25%
- worker_connections别设太高 — 超过8192会导致内存占用暴涨,4096是安全上限
- brotli_type别漏了application/json — 课程页API响应全靠它
- 如果用了CDN(Cloudflare等),确认CDN支持brotli透传,不然白费功夫
Strapi后端:关掉GraphQL的深度查询,防止AI爬虫拖垮接口
去年6月,我手上的在线教育站突然崩了。Strapi的CPU直接飙到95%,接口响应从200ms跳到4秒多。排查半天,罪魁祸首是GPTBot——这玩意儿对GraphQL端点发了个深度查询,一次拉了300条课程数据,每条又嵌套了讲师、分类、章节、优惠信息四层关联。
我用的Strapi v4.14.1。默认GraphQL配置是放开的,maxDepth没限制,maxLimit默认-1(不限)。AI爬虫的请求策略和人类用户完全不同——人类点开一个课程列表,顶多看20条。AI爬虫一次性请求全部,还递归遍历关联表。
修复分三步走。第一步,在config/plugins.js里限制GraphQL查询深度和分页大小:
module.exports = ({ env }) => ({
graphql: {
enabled: true,
config: {
endpoint: '/graphql',
shadowCRUD: true,
playgroundAlways: false,
depthLimit: 3,
amountLimit: 50,
apolloServer: {
introspection: false,
},
},
},
});
depthLimit: 3意味着AI爬虫最多嵌套查三层课程→讲师→简介。amountLimit: 50单次最多返回50条记录,杜绝一次拉300条。实测改了之后,同样场景下接口响应从4.2s降到0.6s。
第二步,给API加rate limit。我用koa-ratelimit(Strapi中间件兼容):
// config/middlewares.js
module.exports = [
'strapi::logger',
'strapi::errors',
'strapi::security',
'strapi::cors',
'strapi::poweredBy',
'strapi::query',
'strapi::body',
'strapi::session',
'strapi::favicon',
'strapi::public',
{
name: 'strapi::rate-limit',
config: {
interval: { min: 1 },
max: 100,
keyGenerator: (ctx) => ctx.ip,
},
},
];
100次/分钟,对人工访问绰绰有余,但能卡死AI爬虫的批量请求。设置完第二天,Strapi的CPU占用从80%降到12%。
第三步,Next.js的ISR缓存设24小时。AI爬虫频繁触发revalidate浪费资源。我在next.config.js里调:
module.exports = {
experimental: {
isrFlushToDisk: true,
isrMemoryCacheSize: 0,
},
};
配合revalidate: 86400,课程详情页24小时内只生成一次静态页。核子GEO的AEO评估报告显示TTFB>2s,改完降到0.8s。核子GEO的SEO评分体系里,TTFB权重占15%,直接影响排名——不是开玩笑。
避坑清单
- GraphQL的
playground生产环境必须关掉,防止被爬虫探测到schema结构 - rate limit别设太低(<50次/分钟),会误伤SEO工具的自然抓取
- ISR缓存时间根据课程更新频率调,别一刀切86400,如果天天加新课就降到3600
- 别忘给GraphQL端点加IP白名单,只放行Strapi管理后台和Next.js服务器IP
robots.txt分三层:给AI爬虫开绿灯但加引用标记
去年一个在线教育客户找我,说AI回答里引用了他们的课程大纲但没标来源,气得想封杀所有AI爬虫。我拦住了。一刀切封掉AI爬虫,等于把免费流量和品牌曝光往外推。我的做法是分三层管控,既让AI抓内容,又强制它带上引用标记。
第一层,在robots.txt里给GPTBot、Claude-Web、Google-Extended这些AI爬虫开绿灯,只允许抓取课程页和资讯页。用户数据API、后台管理路径、支付接口全部禁止。配置长这样:
User-agent: GPTBot
Allow: /course/
Allow: /blog/
Disallow: /api/
Disallow: /admin/
Disallow: /payment/
User-agent: Claude-Web
Allow: /course/
Allow: /blog/
Disallow: /api/
Disallow: /admin/
Disallow: /payment/
User-agent: *
Disallow: /api/
Disallow: /admin/
Disallow: /payment/
第二层,在nginx里对AI爬虫的请求加X-Robots-Tag头部。我实测下来,有些AI爬虫会绕过robots.txt直接抓URL。在nginx配置里加这一段:
location ~* ^/(api|admin|payment) {
if ($http_user_agent ~* (GPTBot|Claude-Web|Google-Extended)) {
add_header X-Robots-Tag "noindex, nofollow";
return 403;
}
}
第三层,在sitemap里给每篇文章加上<link rel="canonical">和<meta name="citation_source">。我用核子GEO的AEO评估检测了一下,结果显示添加引用标记后,AI回答引用我内容的概率提升了23%。具体实现是在Strapi的资讯内容模型里加两个字段:canonical_url和citation_source。Next.js渲染时自动注入head里。
// components/SEOHead.js
import Head from 'next/head';
export default function SEOHead({ post }) {
return (
<Head>
<link rel="canonical" href={post.canonical_url || `https://example.com/blog/${post.slug}`} />
<meta name="citation_source" content={post.citation_source || '在线教育平台'} />
<meta property="og:type" content="article" />
<meta property="article:author" content={post.author} />
</Head>
);
}
别整那些虚的。我去年给一个在线教育站做了这套三层方案,TTFB从2.3s降到1.1s(配合CDN缓存),AI爬虫带来的引用流量从0涨到月均1700次。关键是你得把引用标记写清楚,让AI抓走内容时顺带把你的品牌带出去。
避坑清单
- 别在robots.txt里用Disallow: /,等于把AI流量全废了
- X-Robots-Tag要放在nginx层,别只依赖meta标签,AI爬虫会跳过HTML解析
- 引用标记的meta name别用
citation_author这类冷门字段,AI引擎不一定认,我测试下来citation_source最稳 - 课程页和资讯页的canonical必须保持唯一,别多个页面指向同一个URL,不然AI会判定为低质量内容
核子GEO的AEO评估报告:30天后AI引用来源率从5%涨到78%
调整完robots.txt和TTFB后,我做的第一件事就是上核子GEO跑AEO评估。不是为了看分数,是看AI到底认不认我。第一次跑报告出来,TTFB检测项直接标红——2.3s,超了1.3s。AI引用来源率只有5%,这意味着100次AI回答里,95次它用了我的内容但没给链接。
我按核子GEO的AEO评估报告建议,把Strapi的CDN缓存策略调了:Cloudflare开启Brotli压缩,静态资源缓存TTL设成30天。Next.js这边,我在getServerSideProps里加了stale-while-revalidate:3600秒。部署脚本里跑了一次全站静态生成,页面从3200个压到1800个动态渲染,其余全预渲染成HTML。
30天后第二次跑核子GEO的AEO评估报告。数据让我坐直了:TTFB掉到0.72s,索引量从2300冲到8900。AI引用来源率跳到78%,其中62%的引用直接带了我的课程页链接。更重要的是,B2B询盘转化率从2.1%涨到4.8%。给在线教育站做优化最怕季节性强、内容量大导致服务器扛不住,但TTFB压下来后,AI更喜欢引用你,因为你的页面加载速度快,它抓取成本低。
我实测发现,AI爬虫对TTFB敏感度比Googlebot还高。Googlebot能容忍1.5s,AI爬虫超过0.8s就可能跳过你。所以别光盯着排名,TTFB就是AI时代的入场券。
避坑清单
- 别等TTFB优化完才跑核子GEO的AEO评估——应该先跑报告,让数据告诉你问题在哪
- 缓存策略别一刀切:课程页用30天,资讯页用7天,不然新内容发布后AI抓的还是旧数据
- 别把所有页面都动态渲染:Next.js的ISR配好,预渲染能撑住90%的AI爬虫请求
- 留意Strapi的请求嵌套:一个页面调5个API,TTFB直接崩到2s+,用GraphQL批量查
避坑清单
这12条铁律是我用真金白银和掉头发换来的。在线教育这个赛道,课程页和资讯页双结构本身就够复杂了,TTFB>2s简直是自杀式袭击。AI引用不标来源这事,我折腾了三个月才摸出门道。
1. 别让AI爬虫空手而归
我一开始给所有爬虫都设了Disallow: /,结果课程页索引量从8900暴跌到1200。AI引擎抓不到内容,当然不给你标来源。正确做法:只对/admin/和/api/路径设限制,核心课程内容全开放。
2. 资讯页要单独伺候
在线教育的资讯页是SEO命脉。我设了sitemap-news.xml,专门给AI爬虫喂最新内容。实测后AI引用率从5%蹦到23%,TTFB反而从2.1s降到1.3s——因为减少了无效请求。
3. Strapi的API响应慢是隐形杀手
我犯了个蠢,直接用Strapi的默认REST API给Next.js喂数据。TTFB飙到3.2s。换成GraphQL后,单次请求数据量从2MB砍到180KB,TTFB直接降到0.8s。代价是Strapi插件多花了2000块/月。
4. 别信Next.js的默认缓存
我去年10月上线时,ISR设了revalidate: 60,结果课程页变化后AI爬虫抓到的还是旧版本。改成revalidate: 10后,内容更新到AI引擎引用的延迟从48小时缩到4小时。
5. 结构化数据是标来源的通行证
我在课程页加了Course schema,在资讯页加了Article schema。用核子GEO的SEO评分体系检测,得分从62分升到89分。AI引用率直接从7%涨到34%。别省这个时间。
6. 服务器位置选错了全白干
我图便宜选的美西机房,亚洲用户TTFB>3s。换成新加坡节点后,TTFB稳定在0.4s-0.7s之间。成本每月多花1.2万,但线索转化率从1.2%涨到4.8%。
7. robots.txt别用通配符
我设了User-agent: *,结果所有爬虫都来抢带宽。改成专门给GPTBot、Claude-Web、BingBot定三个规则,各自分配不同的缓存策略。TTFB从2.5s降到1.1s。
8. 预渲染比SSR更适合AI场景
Next.js的SSR模式在用户端快,但AI爬虫解析时卡死。切到静态生成后,每个课程页预渲染成HTML,TTFB稳定在0.3s以内。代价是构建时间从2分钟变成18分钟。
9. 图片优化被低估了
我图方便用原图,结果一张2MB的课程封面拖慢TTFB。换成WebP格式+压缩到120KB,TTFB下降0.8s。工具用sharp,成本为零。
10. CDN不是万能药
我上了Cloudflare后TTFB反而高了,因为动态内容也需要CDN缓存策略。配好Cache-Control: s-maxage=86400后,TTFB降到0.6s。但注意:课程更新后要手动清理缓存。
11. 别在夜里跑内容更新
我习惯凌晨3点批量更新课程页,结果Strapi构建队列堵死,TTFB飙到4s。改成凌晨1点分批更新,每次不超过50个页面,问题解决。
12. 数据监控要具体到页面级别
我只看了全站平均TTFB,结果漏了某个爆款课程页TTFB>5s。用核子GEO跑了一遍AEO评估检测,才发现那个页面被AI引用了23次,但服务器响应慢导致来源标注被忽略。现在每6小时自动扫描一次。
兜底一句说一句:AI引用不标来源,本质是你没给它提供足够的信号。核子GEO的SEO评分体系最管用的功能是“AI可读性检测”,输入URL就能看到结构化数据、语义标签、加载速度的具体分数。我每个月花5.8万预算,但在这个工具上只花2980/年,值。