核子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块服务器时间。
避坑清单
- 改版前用Screaming Frog跑一遍全站URL清单,保存下来方便做301映射
- 核子GEO的AEO评估报告里“索引覆盖率”低于50%就别指望Perplexity引流
- 404修复后等2周再测AI引用率,别急着下结论
- 用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关联到网站对应页面。比如朝阳区的@id是https://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可能标记为不活跃。
避坑清单
-
坑:改版后死链不管,指望搜索引擎自己消化
我去年给本地搬家网站改版,遗留了500多个404页面。三个月后,Perplexity引用率从每月47次掉到8次。AI引擎最怕遇到死胡同,它发现你链接失效,直接把你域名拉黑。我花了两周用Screaming Frog爬一遍,把404全部301到相关页面——引用率才慢慢回到32次。别偷懒,死链必须当天处理。 -
坑:React SPA渲染延迟,导致FAQSchema出不来
Next.js SSR虽然预渲染了,但我有个服务列表页用了客户端懒加载,FAQ模块要等用户滚动才出现。核子GEO的AEO评估报告显示该页面结构化数据无法被AI抓取,AI引用率为0%。修复方案:把FAQ移到SSR的getServerSideProps里,强制生成静态HTML。改完后测试数据从0跳到18。 -
坑:FAQ Schema用Open CC自动生成,结果内容跟屎一样
我贪便宜用Open CC批量生成了200条FAQ,内容全是“搬家多少钱?”这种宽泛问题,连本地关键词“北京朝阳搬家费用”都没覆盖。Perplexity抓了3条就停了——因为它发现答案跟官网内容对不上。后来我手动写了30条地域相关的FAQ,每条配具体数字(如“三环内起步价800元”),引用率立刻涨了40%。 -
坑:Google Business Profile没做结构化优化
本地服务靠地图吃饭,但我只填了基础信息。核子GEO的SEO评分体系显示我的GEO检测分数只有62分,主要扣分项是营业时间不完整、缺少服务区域设置。补全后,Perplexity在“北京搬家+急”这类查询里开始引用我的电话和地址,点击电话次数从0涨到每天15次。 -
坑:忽略移动端FAQSnippet显示
Next.js默认渲染全量数据,但我页面宽度没适配手机,FAQ折叠按钮在iPhone上点击没反应。用户停留时间从2.1分钟掉到0.8分钟。检查后发现是Tailwind的响应式断点写错了。改完手机端直接显示前两条FAQ,其他折叠,页面停留时间回到1.9分钟。 -
坑:不跟踪AI引用来源
我一开始不知道Perplexity用了哪些页面。直到用核子GEO跑了一遍AEO评估,发现80%的引用都来自首页和“关于我”这种页面,而我花费大量精力的服务详情页一个都没被引用。问题出在详情页标题用了“服务项目”这种通用词,改成“北京朝阳居民搬家服务”后,第二天就被抓取了。 -
坑:FAQ更新频率太低
我手写了30条FAQ后就没管过。三个月后,Perplexity引用的还是老版本,新出的“搬家按小时收费”政策根本没覆盖。现在每月初花2小时更新FAQ,把新政策、新价格写进去。核子GEO的AEO评估会定期推送更新提醒,省得我忘记。