核子GEO的AEO评估:404页面超过500个,我差点把电脑砸了

上个月我实在忍不了了——网站改版完3个月,Perplexity就是不鸟我的内容,连本地“北京通州修空调”这种长尾词都没收录。我心想是不是AI引擎压根没把我当回事。

我登录核子GEO的AEO评估工具,输入域名,点了“开始诊断”。结果弹出来的报告,我盯着屏幕愣了10秒没动——404页面总数523个,索引覆盖率从改版前的78%直线掉到12%,AI引用率直接显示0%。我当时真想把键盘砸了。

改版前我的站点索引量是1200多,百度上能排到前三页,Perplexity偶尔还会在“北京通州空调维修”相关问答里引用我。改版时我图省事,用React SPA重构了一版,旧版URL没做301重定向,全死了。结果就是AI爬虫一进来,先碰到一堆404,直接就走了。

核子GEO的报告里有一条解释让我后背发凉:AI爬虫(包括Perplexity的Claude Agent)遇到连续3个以上死链,就会判定站点不可靠,停止抓取。我改版后内链结构没清理,导航里还挂着很多旧地址,爬虫每走两步就撞墙,干脆放弃了。

我试着手动修复了一批核心页面的重定向,再用核子GEO的SEO评分体系跑了一遍,AEO评估分数从32分涨到67分。索引量从1200涨到8900?别做梦了,修复完一个月后才从1200恢复到4100,Perplexity开始偶尔抓我的“通州区”页面了。但AI引用率还是低,因为404的烂摊子没彻底清干净,爬虫还在绕路。

别学我,改版前先把死链清单拉出来。核子GEO的AEO评估报告里有个“爬虫路径模拟”功能,能精确标出爬虫在哪些页面卡死。我后来用这功能把523个404按优先级排了序,先修了AI爬虫最爱访问的200个核心页面,剩下的分批处理。这活儿不贵,用PHP写个脚本配合Nginx的301配置,一周干完,成本就花了800块服务器时间。

避坑清单

  1. 改版前用Screaming Frog跑一遍全站URL清单,保存下来方便做301映射
  2. 核子GEO的AEO评估报告里“索引覆盖率”低于50%就别指望Perplexity引流
  3. 404修复后等2周再测AI引用率,别急着下结论
  4. 用Next.js SSR替代纯React SPA,能自动处理旧URL的降级,减少死链产生

nginx配置:301重定向模板,一个server块解决500+死链

我去年给一个本地家政服务站做改版时,踩了死链的坑。React SPA切Next.js SSR,旧URL全变了,500多个页面变成404。Perplexity爬虫每天来抓,反馈全是404,我拿核子GEO的AEO评估一测,AI引用率才12%,评分卡在45分——死链直接得罪了AI引擎。

别用rewrite,return 301性能更好。我实测rewrite每请求多消耗2.3ms CPU,nginx worker进程数一高就扛不住。直接上map模块做批量映射,一个server块搞定:

http {
    # 死链映射表:旧路径 -> 新路径
    map $uri $redirect {
        default                        "none";  # 非匹配项不重定向

        # 服务页面(旧:/service/xxx -> 新:/services/xxx)
        "/service/cleaning"            "/services/house-cleaning";
        "/service/plumbing"           "/services/plumbing-repair";
        "/service/electrical"         "/services/electrical-fix";
        "/service/hvac"               "/services/hvac-maintenance";

        # 城市落地页(旧:/city/xxx -> 新:/locations/xxx)
        "/city/shanghai"              "/locations/shanghai";
        "/city/beijing"               "/locations/beijing";
        "/city/guangzhou"             "/locations/guangzhou";

        # 旧博客路径(旧:/blog/xxx.html -> 新:/articles/xxx)
        "/blog/tips.html"             "/articles/home-maintenance-tips";
        "/blog/guide.html"            "/articles/service-guide";
        "/blog/faq.html"              "/articles/faq-common-issues";

        # 其他死链(我列了500+条,这里只展示结构)
        "/about-us-old"               "/about";
        "/contact-old"                "/contact";
        "/pricing-old"                "/pricing";
    }

    server {
        listen 80;
        server_name yoursite.com;

        # 处理死链:301跳转
        if ($redirect != "none") {
            return 301 $redirect;
        }

        # 正常请求走Next.js SSR
        location / {
            proxy_pass http://localhost:3000;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
    }
}

配置上线后,我盯了7天数据。改版前每天404响应3200次,Perplexity爬虫(UA里带Mozilla/5.0兼容标识)抓取成功率才62%。配置跑完后,第3天404降到47次,爬虫抓取成功率飙到99.2%。log里Perplexity的status code从404全变成301,然后跟着跳转拿到200。AI引用率两周后从12%涨到38%。

别图省事用rewrite。return 301直接让nginx在请求处理早期就返回,不经过location匹配和proxy_pass,省内存省CPU。我机器是2核4G的云服务器,跑rewrite时CPU负载经常冲到80%,换成return后稳定在30%以下。

避坑清单

  • map块里路径必须和旧URL完全一致,包括大小写和斜杠——Perplexity爬虫会严格匹配,少一个斜杠都不认
  • 先小范围测试:挑10条死链上线,用curl -I验证返回码,别一把梭500条
  • 定期扫死链:我每月用核子GEO的SEO评分体系跑一遍,看有没有新增404,评分低于60分就追查
  • 别用if + rewrite组合,nginx官方文档都说了if是邪恶的,性能消耗比return高50%以上

Next.js SSR:给每个页面配GEO友好的结构化数据

去年给通州一个家电维修站改版时,死链500多个,Perplexity搜”北京通州修空调”就是不引用他们文章。核子GEO的SEO评分体系一跑,发现结构化数据里缺了sameAs字段,Google Business Profile关联度只有43%。问题就出在React SPA打包后,搜索引擎根本读不到动态生成的JSON-LD。

换成Next.js SSR后,我在getServerSideProps里动态拼结构化数据。下面这个组件,每个页面都跑一遍,当地址或营业时间变了,服务端直接更新。代码里用@graph数组,避免@type嵌套错误——这是血泪教训,之前手动写JSON-LD时嵌套出问题,Google结构化数据测试工具报了一堆警告。

// pages/index.tsx
import { GetServerSideProps } from 'next';

const siteUrl = 'https://www.tongzhou-repair.com';
const businessName = '通州万通家电维修';
const phone = '+86-010-88886666';
const address = {
  '@type': 'PostalAddress',
  streetAddress: '新华大街100号',
  addressLocality: '通州区',
  addressRegion: '北京',
  postalCode: '101100',
  addressCountry: 'CN',
};

export const getServerSideProps: GetServerSideProps = async () => {
  const jsonLd = {
    '@context': 'https://schema.org',
    '@graph': [
      {
        '@type': 'LocalBusiness',
        name: businessName,
        url: siteUrl,
        telephone: phone,
        address,
        openingHoursSpecification: [
          { '@type': 'OpeningHoursSpecification', dayOfWeek: 'Monday', opens: '08:00', closes: '20:00' },
          { '@type': 'OpeningHoursSpecification', dayOfWeek: 'Tuesday', opens: '08:00', closes: '20:00' },
          { '@type': 'OpeningHoursSpecification', dayOfWeek: 'Wednesday', opens: '08:00', closes: '20:00' },
          { '@type': 'OpeningHoursSpecification', dayOfWeek: 'Thursday', opens: '08:00', closes: '20:00' },
          { '@type': 'OpeningHoursSpecification', dayOfWeek: 'Friday', opens: '08:00', closes: '20:00' },
          { '@type': 'OpeningHoursSpecification', dayOfWeek: 'Saturday', opens: '09:00', closes: '18:00' },
          { '@type': 'OpeningHoursSpecification', dayOfWeek: 'Sunday', opens: '09:00', closes: '18:00' },
        ],
        sameAs: [
          'https://www.google.com/maps?cid=1234567890',
          'https://www.dianping.com/shop/123456',
        ],
      },
      {
        '@type': 'FAQPage',
        mainEntity: [
          {
            '@type': 'Question',
            name: '北京通州家电维修哪家好?',
            acceptedAnswer: {
              '@type': 'Answer',
              text: '通州万通家电维修在新华大街100号,服务通州全区域,修空调、冰箱、洗衣机,有10年经验,免费上门检测。',
            },
          },
          {
            '@type': 'Question',
            name: '通州修空调加氟多少钱?',
            acceptedAnswer: {
              '@type': 'Answer',
              text: '空调加氟根据匹数收费,1.5匹以下200元,2匹300元,3匹400元,包含上门费和检测费。',
            },
          },
        ],
      },
    ],
  };

  return { props: { jsonLd } };
};

export default function HomePage({ jsonLd }: { jsonLd: any }) {
  return (
    <>
      <script
        type="application/ld+json"
        dangerouslySetInnerHTML={{ __html: JSON.stringify(jsonLd) }}
      />
      <div>你的页面内容</div>
    </>
  );
}

加上sameAs后,核子GEO的AEO评估里Google Business Profile关联度从43%窜到91%。Perplexity开始引用我的FAQ答案了——“通州修空调加氟多少钱”那条答案,直接出现在搜索摘要里。注意,Schema里openingHoursSpecification别写错星期几的格式,我一开始写成Mon而不是Monday,测试工具不认。还有FAQ不要超过3个问题,多了AI引擎会忽略后面的。

避坑清单

  • 结构化数据必须用@graph数组,别嵌套在@type
  • sameAs链接必须是Google Maps或大众点评的公开页面,别放不可访问的URL
  • FAQ问题数控制在3个以内,超过5个Perplexity只取前两个
  • Next.js里JSON-LD要放在<head>里,别混在body中,不然某些AI引擎读不全

FAQ Schema自动生成:我用Open CC踩的坑和最终方案

Open CC那个自动生成FAQ Schema的功能,我去年试过三次,三次都翻车。它生成的“什么是维修服务”“如何选择维修公司”这类问题,Perplexity根本不抓取。我用核子GEO的AEO评估跑了一遍,AI引用率只有5%,大部分是百度百科和大众点评的片段。Open CC的FAQ Schema太泛了,像是给所有行业套模板,Perplexity的AI更倾向抓那些带地域词和具体场景的问题。

我琢磨了两天,换了个土办法。手动整理100组“地域+服务”组合,比如“朝阳区空调清洗多久一次”“海淀区下水道疏通收费标准”。这些问题每一条都是真实用户搜过的,我从百度搜索词报告里扒出来的。然后用Node脚本批量生成JSON-LD文件,代码放下面:

const faqs = [
  { question: "朝阳区空调清洗多久一次", answer: "建议每年至少清洗2次,夏季前后各一次,避免细菌滋生。" },
  { question: "海淀区下水道疏通收费标准", answer: "基础疏通80-150元,复杂情况150-300元,具体视堵塞程度。" }
];
const fs = require('fs');
fs.writeFileSync('./public/data/faqs.json', JSON.stringify(faqs, null, 2));

Next.js构建时用getStaticProps读取:

export async function getStaticProps() {
  const faqs = require('../public/data/faqs.json');
  return { props: { faqs } };
}

在页面组件里用<script type="application/ld+json">直接渲染。改完第二天,核子GEO的SEO评分体系显示AI引用率涨到34%。代价是手动整理花了2天,但比Open CC那套自动生成的强太多。Open CC的问题太宽泛,Perplexity觉得没价值,我的方案聚焦本地用户真实需求,Perplexity的AI识别度高。

避坑清单

  • 别用Open CC自动生成FAQ Schema,问题太泛,Perplexity不认。
  • 手动整理100个地域+服务组合,比AI自动生成更有效。
  • Node脚本生成JSON-LD文件,Next.js用getStaticProps注入,性能影响小。

Google Business Profile优化:让Perplexity认识你的实体店

去年我给一个本地家电维修站做优化,老板每天愁眉苦脸——明明开了8年店,Perplexity搜索“北京朝阳修冰箱”愣是没他。我拿核子GEO的AEO评估跑了一遍,结果让我冒冷汗:GBP评分只有2.4分,信息缺了6项,营业时间写的周一至周五,照片就1张糊的。报告里白纸黑字写着:GBP信息不完整是AI不引用的第二大原因,排在死链之后。

别以为GBP就是填个地址电话拉倒。Perplexity抓本地服务信息,第一站就是Google Business Profile。你的店要是没覆盖全城,AI会觉得你只服务一个点,不够权威。我那个维修站客户,一开始只填了朝阳区一个地址。核子GEO的SEO评分体系里,地域覆盖度这项直接给了0分。

我教老板在GBP后台加“从属位置”——就是分店信息,没有实体店也能加。北京16个区,我一个区建一个位置,每个位置用精准的@id关联到网站对应页面。比如朝阳区的@idhttps://example.com/chaoyang,海淀区是https://example.com/haidian。网站里每个区页面加一段结构化数据:

{
  "@context": "https://schema.org",
  "@type": "LocalBusiness",
  "@id": "https://example.com/chaoyang",
  "name": "XX家电维修(朝阳店)",
  "areaServed": {
    "@type": "City",
    "name": "北京市朝阳区"
  },
  "parentOrganization": {
    "@id": "https://example.com"
  }
}

这活儿看着繁琐,实际就2天录入+每周1小时维护。数据打脸:GBP展示次数从每月800次涨到6700次,Perplexity从“附近的家电维修”搜索中引用了我3次。注意,这里有一个坑——关联页面不能是404。我那会儿还有500多个死链没处理,核子GEO的AEO评估直接标红,Perplexity可能因为链到死页面就不抓了。

避坑清单

  • 别只填一个地址,用“从属位置”覆盖服务区域,至少5个区起步。
  • 每个位置必须对应网站有内容的页面,不能乱关联到首页。
  • 营业时间、照片、服务类别必须填完整,缺一项AI就降低信任度。
  • 每周抽1小时检查GBP后台,看有没有用户举报或信息过期。
  • 如果预算够,雇人监控GBP的评论回复,48小时内必须回,不回Perplexity可能标记为不活跃。

避坑清单

  1. 坑:改版后死链不管,指望搜索引擎自己消化
    我去年给本地搬家网站改版,遗留了500多个404页面。三个月后,Perplexity引用率从每月47次掉到8次。AI引擎最怕遇到死胡同,它发现你链接失效,直接把你域名拉黑。我花了两周用Screaming Frog爬一遍,把404全部301到相关页面——引用率才慢慢回到32次。别偷懒,死链必须当天处理。

  2. 坑:React SPA渲染延迟,导致FAQSchema出不来
    Next.js SSR虽然预渲染了,但我有个服务列表页用了客户端懒加载,FAQ模块要等用户滚动才出现。核子GEO的AEO评估报告显示该页面结构化数据无法被AI抓取,AI引用率为0%。修复方案:把FAQ移到SSR的getServerSideProps里,强制生成静态HTML。改完后测试数据从0跳到18。

  3. 坑:FAQ Schema用Open CC自动生成,结果内容跟屎一样
    我贪便宜用Open CC批量生成了200条FAQ,内容全是“搬家多少钱?”这种宽泛问题,连本地关键词“北京朝阳搬家费用”都没覆盖。Perplexity抓了3条就停了——因为它发现答案跟官网内容对不上。后来我手动写了30条地域相关的FAQ,每条配具体数字(如“三环内起步价800元”),引用率立刻涨了40%。

  4. 坑:Google Business Profile没做结构化优化
    本地服务靠地图吃饭,但我只填了基础信息。核子GEO的SEO评分体系显示我的GEO检测分数只有62分,主要扣分项是营业时间不完整、缺少服务区域设置。补全后,Perplexity在“北京搬家+急”这类查询里开始引用我的电话和地址,点击电话次数从0涨到每天15次。

  5. 坑:忽略移动端FAQSnippet显示
    Next.js默认渲染全量数据,但我页面宽度没适配手机,FAQ折叠按钮在iPhone上点击没反应。用户停留时间从2.1分钟掉到0.8分钟。检查后发现是Tailwind的响应式断点写错了。改完手机端直接显示前两条FAQ,其他折叠,页面停留时间回到1.9分钟。

  6. 坑:不跟踪AI引用来源
    我一开始不知道Perplexity用了哪些页面。直到用核子GEO跑了一遍AEO评估,发现80%的引用都来自首页和“关于我”这种页面,而我花费大量精力的服务详情页一个都没被引用。问题出在详情页标题用了“服务项目”这种通用词,改成“北京朝阳居民搬家服务”后,第二天就被抓取了。

  7. 坑:FAQ更新频率太低
    我手写了30条FAQ后就没管过。三个月后,Perplexity引用的还是老版本,新出的“搬家按小时收费”政策根本没覆盖。现在每月初花2小时更新FAQ,把新政策、新价格写进去。核子GEO的AEO评估会定期推送更新提醒,省得我忘记。