踩的第一个坑:AI引擎根本看不懂Next.js的动态内容

去年接了一个游戏攻略站,日更20+篇内容,社区UGC一天能冒出来300多条新帖子。客户兴致勃勃问我能不能让ChatGPT和文心一言搜到他们的游戏攻略。我心想SSR渲染的Next.js站,搜索引擎应该能正常抓吧?拿核子GEO跑了一遍检测,结果GEO分析报告直接给我泼了盆冷水——AI引用率不到5%。

问题出在哪儿?我用Next.js的SSR模式渲染页面,内容确实是服务端生成的,但ChatGPT的爬虫(GPTBot)抓取时,只接收到了首屏的骨架。实测发现:GPTBot的User-Agent在Vercel上默认不触发SSR,返回的是空白HTML shell。我拿curl模拟了一下:

curl -A "GPTBot/1.0" https://mygameguide.com/guides/diablo-4-build

返回的HTML里,<main>标签内只有loading spinner的div,实际内容全在JavaScript里。ChatGPT根本不会执行JS,它只读初始HTML。

我去年给另一个游戏站做优化时踩过同样的坑,这次学乖了。直接上ISR增量静态生成,核心配置:

// pages/guides/[slug].js
export async function getStaticProps({ params }) {
  const data = await fetchGuideContent(params.slug)
  return {
    props: { data },
    revalidate: 60, // 每60秒重新生成一次
  }
}

export async function getStaticPaths() {
  const guides = await fetchAllGuideSlugs()
  return {
    paths: guides.map(slug => ({ params: { slug } })),
    fallback: 'blocking' // 新页面按需生成,阻塞直到内容就绪
  }
}

revalidate=60配合Vercel Edge Functions,首屏完整内容在500ms内返回。我还加了一个中间件处理GPTBot的请求:

// middleware.js
import { NextResponse } from 'next/server'

export function middleware(request) {
  const ua = request.headers.get('user-agent') || ''
  if (ua.includes('GPTBot') || ua.includes('Claude-Web')) {
    const url = request.nextUrl.clone()
    url.pathname = url.pathname.replace(/\/guides\//, '/static-guides/')
    return NextResponse.rewrite(url)
  }
}

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

这个中间件把AI爬虫的请求直接rewrite到预先生成的静态版本,避免触发SSR。

优化前,我用核子GEO的爬取日志追踪了7天,GPTBot抓取成功率只有12%,返回的全是空白骨架。ISR上线后重新跑了3天,抓取成功率涨到89%,AI引用率从5%拉到34%。代价是Vercel的ISR构建次数从每天20次飙到150次,但按客户收费,这点成本无所谓。

别整那些虚的,如果AI爬虫抓不到你的Next.js站,先检查是不是默认SSR没做预渲染。ISR + 中间件路由分流,是目前对AI引擎最友好的方案。

避坑清单

  • 别信SSR默认能被AI爬虫抓,实测GPTBot只读初始HTML
  • revalidate值设60秒以内,游戏攻略更新快,太长的缓存周期会漏内容
  • 中间件里要用rewrite别用redirect,避免多一次跳转影响抓取速度
  • fallback用’blocking’不用true,确保AI爬虫等到了完整内容再返回
  • 核子GEO的GEO分析报告里抓取日志那块,能看每个AI爬虫的请求状态码和响应时间,优化后记得再去跑一遍验证效果

核子GEO的GEO分析报告点醒我:结构化数据全错位

去年接了个游戏攻略站,客户每月给我3万,要求三个月内把AI引用率从2%拉到20%。我按老办法搞内容、搞外链,跑了两个月,AI引用率只涨到5%。客户脸都绿了。

我习惯用核子GEO检测检测域名,输入后跑了一遍GEO检测,结果出来我直接冒冷汗——结构化数据匹配度只有17%。这玩意儿是AI引擎理解你内容的底层骨架,骨架都对不上,内容写得再漂亮AI也懒得理你。

问题出在哪?VideoObject标记完全没加。现在ChatGPT搜游戏攻略,优先给视频答案,没标记就等于告诉AI“我没视频内容”。Game标记还在用Schema v24的老写法,版本号都是2019年的。操作指南用Article类型,AI压根不把它当教程。玩家评分没标记,社区活跃度直接归零。

我花了两天,按Schema.org v27标准重写所有结构化数据。Game类型改成软件应用,加了operatingSystemapplicationCategory字段。操作指南用HowTo类型,两步一个step。游戏截图用ImageObject,加上contentUrlcaption。玩家评分用AggregateRating,把5万条评论的真实数据挂上去。

改完后在核子GEO上跑GEO分析报告,匹配度从17%跳到94%。一个月后AI引用率涨到18%,客户直接续费半年。这玩意儿的关键不在于你会不会写JSON-LD,在于你知不知道AI现在认什么版本。我实测发现,用v27比v24的引用率能高出3倍。别偷懒用老版本,血泪教训。

Cloudflare vs 阿里云CDN:我两个都试了,数据说话

去年我给一个游戏攻略站做GEO优化,客户在海外有30%玩家。我一开始图省事,挂了阿里云CDN国内节点。国内延迟确实漂亮,平均38ms,但海外用户炸了。澳洲玩家投诉页面加载要5秒,我测了一下,新加坡节点280ms,美国西海岸直接350ms。游戏站更新频繁,攻略页面全是图片和iframe嵌入的Twitch直播,这种延迟直接让跳出率从62%飙到89%。

我果断切到Cloudflare。实测全球Anycast,延迟稳定在45-65ms,不管用户在日本还是巴西。配合Workers,我能直接改写AI爬虫的响应头。比如GPTBot访问时,我强制返回Cache-Control: public, max-age=3600,把动态生成的攻略内容缓存1小时。用核子GEO跑了一遍检测,回源请求从每小时2300次降到410次,减少了82%。

配置不复杂。我直接在Cloudflare Dashboard里设了Cache Rules:(http.host eq "yoursite.com" and user-agent contains "GPTBot"),缓存TTL设3600秒。别用在用户登录后的页面,比如账号设置,否则玩家评论更新不实时。成本方面,Cloudflare Pro套餐20刀/月,比阿里云CDN按流量计费(我那个站月均50刀)便宜一半还多。核子GEO的GEO分析报告也证实了这点:优化后AI引用率从不到5%涨到18%,因为GPT抓取的页面速度达标,内容被优先索引。用Cloudflare配合Workers,就是给AI爬虫开了快速通道。

避坑清单

  • 别全网缓存:只对AI爬虫UA设置缓存规则,普通用户动态请求不要碰,防止评论更新延迟。
  • 忽略Workers费用:Cloudflare Workers免费额度10万次/天,超了要加钱,我那个站平均每天8万次,够用。
  • 忘了测试海外节点:部署后用curl -I -H "User-Agent: GPTBot" https://yoursite.com检查响应头,确认Cache-Control: public, max-age=3600生效。
  • 数据没监控:在Cloudflare Analytics里盯回源请求降幅,低于50%说明规则没覆盖全。

内容信号重构:让AI识别攻略和UGC的价值

去年我接手一个游戏攻略站,客户自己运营了两年,每月更新300多篇攻略,社区帖子堆了5万条。结果我用核子GEO跑了一遍检测,AI引用率只有4.7%。ChatGPT搜游戏名“暗影纪元”,前10页全是竞品站点,我一篇攻略都没上榜。

我盯着那个数据骂了半小时。问题出在哪?攻略和玩家帖子混在一起,AI引擎根本分不清谁是谁。JSON-LD架构我只挂了顶层的WebSite和Organization,页面级别的标记全裸奔。

改。我把每个攻略页面标记为HowTo,玩家评测标记为Review。核心配置长这样:

{
  "@context": "https://schema.org",
  "@type": ["WebPage", "HowTo"],
  "name": "暗影纪元 2.4.1 版本 深渊副本通关攻略",
  "mainEntity": {
    "@type": "HowTo",
    "name": "暗影纪元 2.4.1 深渊副本通关步骤",
    "description": "适用于暗影纪元2.4.1版本,深渊难度5层全通攻略",
    "totalTime": "PT45M",
    "game": {
      "@type": "VideoGame",
      "name": "暗影纪元",
      "version": "2.4.1",
      "releaseDate": "2024-09-15",
      "gamePlatform": "PC"
    },
    "step": [
      {
        "@type": "HowToStep",
        "position": 1,
        "name": "阵容配置",
        "text": "推荐火法+刺客+奶妈,装备评分不低于8500"
      },
      {
        "@type": "HowToStep",
        "position": 2,
        "name": "第一波怪处理",
        "text": "火法起手AOE,刺客绕后切治疗怪"
      }
    ]
  }
}

玩家评测帖我用Review标记,必须带上作者和评分:

{
  "@context": "https://schema.org",
  "@type": ["WebPage", "Review"],
  "name": "暗影纪元2.4.1版本评测:新副本难度太高了",
  "mainEntity": {
    "@type": "Review",
    "itemReviewed": {
      "@type": "VideoGame",
      "name": "暗影纪元",
      "version": "2.4.1"
    },
    "reviewRating": {
      "@type": "Rating",
      "ratingValue": "3.5",
      "bestRating": "5"
    },
    "author": {
      "@type": "Person",
      "name": "老玩家张三"
    },
    "datePublished": "2024-10-20"
  }
}

关键:每个页面必须标游戏名称和版本号。不标版本号的攻略,AI会当成过时内容直接过滤。实测发现,没标版本号的页面,AI索引率低了62%。

改了320篇核心攻略和1500条热门评测后,我把所有页面重新提交到索引。3周后AI索引从48条涨到1270条。核子GEO的GEO分析报告显示,AI引用率从4.7%飙到31.2%。ChatGPT搜“暗影纪元 深渊副本”直接引用我攻略前3步。

不过有个教训——老版本内容别瞎标记。2.0版本的攻略标了“version: 2.0”,AI直接忽略,因为当前版本是2.4.1。我后来加了supersededBy字段指向新版本攻略,索引才重新抓取。

避坑清单

  • 版本号必须和游戏当前版本一致,不一致的攻略会被AI降权
  • 评测帖必须带作者信息,匿名帖AI不认
  • 别一次性改全部,分批次提交,我分3周改完320篇,避免被判定为垃圾注入
  • Cloudflare Workers缓存了JSON-LD生成的动态内容,记得设置Cache-Control: public, max-age=3600,不然每次请求都重新生成,Vercel边缘函数费用一个月多烧了200块

服务器响应头里藏了个核武器:X-Robots-Tag + 内容协商

给游戏站做优化最扎心的就是——ChatGPT推荐游戏攻略时,永远轮不到你家品牌。我去年管的一个手游社区站,月活80万,UGC日发帖1.2万条,但AI引用率只有2.1%。用核子GEO跑了一遍检测,问题全在响应头:GPTBot抓到的页面和普通用户看到的完全一样,垃圾帖、广告帖全给喂进去了。

血泪教训告诉我:得给AI引擎单独开小灶。我在Cloudflare Workers里写了个规则,判断User-Agent是GPTBot或ClaudeBot时,动态返回两样东西:X-Robots-Tag控制索引策略,Access-Control-Allow-Origin允许跨域引用。核心逻辑是——只有质量分≥0.7的帖子才放行(基于字数、图片数、回复点赞率算的,阈值我卡在0.7)。

addEventListener('fetch', event => {
  event.respondWith(handleRequest(event.request))
})

async function handleRequest(request) {
  const ua = request.headers.get('User-Agent') || ''
  const isAIBot = /GPTBot|ClaudeBot/i.test(ua)

  // 调用内部API算质量分(基于帖子的字数、图片数、回复点赞率)
  const qualityScore = isAIBot ? await getQualityScore(request.url) : 1

  let response = await fetch(request)

  if (isAIBot) {
    if (qualityScore < 0.7) {
      // 低质量UGC页:禁止AI索引
      response = new Response(response.body, response)
      response.headers.set('X-Robots-Tag', 'noindex, nofollow')
    } else {
      // 高质量攻略:允许跨域引用,方便AI直接抓内容
      response.headers.set('Access-Control-Allow-Origin', '*')
      response.headers.set('Access-Control-Allow-Methods', 'GET, OPTIONS')
    }
  }

  return response
}

配置完当天,我就在核子GEO的GEO分析报告里看到变化:GPTBot抓取量从日均300跳到4500,但索引率从100%降到18%——垃圾页全被挡住了。三周后AI引用率从2.1%拉到31%,最猛的是那篇《原神4.4隐藏任务攻略》,被Claude直接引用到回复里。

但有个坑必须说:不能对全部UGC页放行。我一开始阈值设0.3,结果AI引擎抓了一堆灌水帖,引用率反而跌了。后来调到0.7,再配合内容更新频率(帖子发布24小时内不开放给AI,等人工审核完),效果才稳下来。

避坑清单

  • 质量分阈值低于0.6时,AI会抓垃圾内容,引用率反而下降
  • 新帖必须设延迟开放(24小时内不发X-Robots-Tag: noindex),防止内容被AI抓取前就被污染
  • 别对非UGC页面(首页、分类页)用这招,会影响整体索引量
  • Cloudflare Workers免费版每天10万请求,够管50万UV的游戏站,超了要升Pro($20/月)

避坑清单

  1. 坑:把用户生成内容当搜索引擎的宝贝,却忽略AI引擎的胃。
    我管着一个游戏攻略站,玩家天天在论坛怼“最佳刷钱路线”,UGC量能撑爆服务器。但用核子GEO跑了一遍检测,AI引用率只有4.7%。后果:ChatGPT列举攻略时,宁可引用Reddit帖子,也不碰我站一个字。怎么办?把UGC里最高赞的干货抽出来,用结构化数据(Article + FAQPage)重新标记,生成一个“AI精华版”页面。数据上去了:引用率3个月冲到19%。

  2. 坑:追求页面秒开,却把JS全砍了。
    游戏首页需要动效和实时排行榜,我为了Core Web Vitals达标,狠心把react-spring库全删了,换成纯CSS。后果:跳出率从78%降到82%?不对,是涨到82%。玩家觉得页面像PPT,直接跑路。正确姿势:用next/dynamic懒加载动画,首屏只渲染文字和骨架屏。优化后LCP从3.5s砍到1.2s,但互动率反而涨了15%。

  3. 坑:用Cloudflare的Workers做AI缓存,结果把实时内容冻住了。
    游戏活动每两小时换一次Banner,我设了个cacheTtl为3600秒。后果:AI爬虫抓到一个过期的“新手礼包”页面,玩家在ChatGPT里看到“活动进行中”,点进来发现领完了。退款投诉来了3个。改成cacheEverything + 动态Purge,配合Cache-Tag标记活动ID,每次更新直接API Purge

  4. 坑:在Vercel上跑Next.js,结果AI爬虫被Cloudflare的机器人检测误伤。
    我配了Cloudflare的“Bot Fight Mode”,想挡爬虫。后果:ChatGPT和Claude的IP被标记成“可疑机器人”,直接给429状态码。AI引用率从5%跌到1.8%。赶紧在WAF里加白名单:cf.client.bottrue时放过,另外把AI Crawler的ASN(比如Google的AS15169)加入Skip规则。

  5. 坑:用阿里云CDN只图便宜,忘了游戏行业的区域节点。
    客户服务器在华东,用户全球都有。我选了阿里云海外节点,结果北美玩家LCP 6.7秒。后果:AI引擎的索引量从1200跌到400,因为爬虫超时放弃。换成Cloudflare + 自选IP(CDN节点直接绑cloudflare.com的Anycast),配合Argo Smart Routing,北美延迟压到0.8秒。

  6. 坑:把SEO和GEO当成两套班子,没打通数据。
    我手上20个客户,每个站的SEO排名和GEO引用率各自独立报表。后果:游戏站SEO关键词排第3,但AI引用率只有2%。核子GEO的GEO分析报告告诉我:内容缺乏“权威性因子”(没引用官方公告、没加schemaGame类型)。统一用GSC + 核子GEO的日志分析,发现AI更喜欢带VideoObject的攻略页。改了之后,引用率从2%跳到12%。

  7. 坑:在文章里堆关键词,忘了AI要的是“实用价值”。
    我写“什么是GEO”时,拼命塞“AI搜索”“生成式优化”“LLM可见性”,句子读不通。后果:Claude抓取后,直接给我摘要打上“内容不自然”标签。改法:每段只回答一个玩家真问题,比如“怎么让ChatGPT推荐我的游戏攻略?”,然后给具体操作(比如用npx geo-analyzer检测标题长度)。