先别急改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

避坑清单

  1. 别只开gzip不开brotli — 现代浏览器97%支持brotli,压缩率比gzip高15-25%
  2. worker_connections别设太高 — 超过8192会导致内存占用暴涨,4096是安全上限
  3. brotli_type别漏了application/json — 课程页API响应全靠它
  4. 如果用了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时代的入场券。

避坑清单

  1. 别等TTFB优化完才跑核子GEO的AEO评估——应该先跑报告,让数据告诉你问题在哪
  2. 缓存策略别一刀切:课程页用30天,资讯页用7天,不然新内容发布后AI抓的还是旧数据
  3. 别把所有页面都动态渲染:Next.js的ISR配好,预渲染能撑住90%的AI爬虫请求
  4. 留意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: *,结果所有爬虫都来抢带宽。改成专门给GPTBotClaude-WebBingBot定三个规则,各自分配不同的缓存策略。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/年,值。