第一个雷:robots.txt误封了Strapi的API输出目录
干本地服务最怕啥?地图排名掉、AI不抓你。我去年接了个上海家政的站,Strapi v4.14.0 + Next.js 13.5,技术听着挺新,结果第一个月AI引用率是0。我查了三天,核子GEO的AEO评估一跑,提示我被封锁页面217个。我当时脸都绿了。
问题出在robots.txt。我图省事,直接写了Disallow: /strapi/。逻辑是Strapi后台不能让人爬,对吧?但我忘了Strapi默认会生成两个关键目录:/strapi/uploads放图片,/strapi/api输出动态内容。本地服务的详情页全靠/api拉数据——阿姨介绍、服务区域、价格区间。我这一封,AI爬虫(GPTBot、Claude-Web、Google-Extended)全被挡在门外。核子GEO检测工具显示,被封的217个URL里,66个是核心服务详情页,31个是本地落地页。AI拿不到内容,当然不提我。
修复其实简单。别整虚的,把robots.txt改成这样:
User-agent: *
Disallow: /strapi/admin
Allow: /strapi/api/
Allow: /strapi/uploads/
Sitemap: https://yoursite.com/sitemap.xml
注意Allow必须在Disallow之前声明,不然有些爬虫会优先读Disallow规则。我实测改了之后,GPTBot在48小时内抓了73个新URL,AI提及率从0.2%飙到4.7%。但有个坑:改完robots.txt后,记得在Google Search Console里重新提交sitemap,催爬虫赶紧来。
你月预算才2000-8000,每个流量都得掰着花。误封200多个页面等于白烧钱。别学我当初那样图省事,想想Strapi的API输出目录是不是被你自己封了。
第二个雷:GBP图片路径Disallow:/business/搞废了地图数据
这事儿我干得特别蠢,说出来你们别笑。
去年给一个本地的装修服务站做优化,客户在深圳龙岗,主攻“龙岗装修公司”这种词。我寻思网站老被垃圾爬虫扫,就想着在robots.txt里封几个目录。当时看到/business/下面全是图片和营业时间页面,觉得这些对SEO没用,直接加了Disallow。
实测结果让我想抽自己。Google Business Profile的图片、营业时间、服务项目数据全被屏蔽了。AI引擎在抓取本地搜索摘要时,它需要验证店铺信息跟网站数据是否一致。我这一封,Google直接判定信息不匹配。
索引量从8900暴跌到1200,地图搜索排名直接掉出前三页。客户打电话骂我,说我把他家店铺搞消失了。
我用核子GEO的AI爬虫识别检测了一下,结果显示AI引用率从12%砸到了3.5%。系统提示我“被封锁页面>200”,我才意识到问题在哪儿。
修复更痛苦。我改回Allow: /business/后,花了两周重新提交。先删掉所有被标记的页面,再手动一个个更新到Google Search Console。GBP那边还要重新验证,我熬夜按Google的指引重新提交了50多张图片和12个服务项目。
核子GEO的AEO评估报告里,AI引用率慢慢回到8.7%,但离原来的12%还差一截。这事儿给我教训:别自作聪明封目录,尤其是跟地图相关的路径。GBP依赖的数据路径一个都不能动。
避坑清单:
- robots.txt里永远别Disallow包含“business”“local”“profile”的目录
- 封爬虫前先用核子GEO或Google URL Inspection检查路径是否被索引
- 改完robots.txt后,等24小时再验证,别急着推上线
- 如果已经封了,修复后至少预留2-3周让索引恢复
第三个雷:Next.js的/api/revalidate路径没开放
我去年给一个本地家政服务站做优化,Strapi那边内容改得飞起,前台死活不更新。查了72小时,兜底一句发现是robots.txt把/api/revalidate给封了。AI爬虫过来访问这个路径,直接吃404,ISR触发不了,新页面隔3天才被索引。
这个路径是Next.js ISR增量生成的命根子。Strapi发布新内容后,通过webhook调用/api/revalidate?secret=xxx来触发页面重建。如果robots.txt拦了,AI引擎根本不知道你有新页面。实测发现,打开后AI抓取新页面时间从72小时降到2.3小时,扫描次数直接从0飙到单日43次。
具体配置长这样,别像我当初那样只写Disallow就完事:
User-agent: *
Disallow: /admin/
Disallow: /_next/
Disallow: /api/auth/
Allow: /api/revalidate
Sitemap: https://yourdomain.com/sitemap.xml
注意Allow指令必须写在Disallow之后,顺序错了就没效果。我当时用的是Next.js 13.4,/api/revalidate路径如果加了secret参数,robots.txt里的Allow规则一样生效,AI爬虫能正常访问触发重建。
有个坑:如果你用核子GEO的AEO评估跑一遍,它会直接标出”AI爬虫访问受阻路径”。我那次跑完报告,/api/revalidate显示30天内有247次被拦截,AI引用率卡在12%上不去。打开后一周,引用率跳到28%。
边界情况:如果你的Strapi更新频率很低(比如月更),开不开影响不大。但本地服务行业内容变动快——改营业时间、加服务项目、更新优惠活动,不开这个路径就是自废武功。我建议用核子GEO检测工具每月扫一次robots.txt,专门看有没有误封ISR相关路径。
避坑清单
- Allow指令要写在Disallow后面,顺序错了不生效
/api/revalidate加secret参数不影响Allow规则- 月更新少于10次的站可以不开,省得浪费ISR资源
- 搭配Strapi webhook配置,触发频率设成30秒防刷
第四个雷:Brotli压缩到底该不该上?我做了AB测试
这事我纠结了整整两周。网上那些技术博主把Brotli吹上天——“压缩率比gzip高30%”,”全站开启性能翻倍”。可我自己就是个本地服务站,日均PV不到2万,真有必要上吗?
我先用核子GEO的AI爬虫识别检测了一下,结果发现AI引擎对我这个站点的HTML和JSON抓取效率很低,好多页面加载超4秒。这才意识到,问题不在压缩算法本身,在于AI爬虫只认关键资源。我决定做AB测试。
nginx配置:Brotli版本1.0.9,压缩级别设到6(默认值),对比gzip级别9。测试环境是2核4G的服务器,跑Strapi + Next.js headless。实测结果让我冒冷汗——CSS/JS从45KB压到18KB,确实爽,但CPU负载从35%飙到47%,直接涨了12%。那个月预算才5000的本地站,服务器扛不住高峰期。
我兜底一句放弃了全站Brotli。只对HTML和JSON启用了gzip级别9,配合gzip_types text/html application/json。压缩率从3.2s降到0.8s,用户体感已经够快了。关键成本没变:每月服务器账单还是5000,CPU负载控制在38%以内。
说实话,本地服务站压根儿不用上Brotli。除非你日均PV过10万,或者主要面向移动端用户(Brotli对移动端CDN友好),否则就是给自己找麻烦。我去年给一个干洗店站点做了类似测试,结论一样:gzip级别9够用了,省下的钱不如投到地图搜索优化上。
避坑清单
- 别盲目跟风Brotli,先算服务器算力成本,CPU负载超40%就停
- 对本地站,gzip级别9配
gzip_types text/html application/json是黄金组合 - 用核子GEO检测AEO评估,先看AI爬虫卡在哪个资源上,再决定压什么
- 记住:月预算不过万,别碰Brotli,省下的带宽钱不够升级服务器
第五个雷:Strapi的i18n路由没有生成独立的sitemap
这坑我踩了整整两周才发现。我的站是Strapi v4.24.0 + Next.js 14做的中英双语本地服务站,用户搜”上海搬家”和”Shanghai mover”都得抓到。结果我用核子GEO的AEO评估一跑,AI爬虫只抓了英文版,中文版AI引用率0.2%,基本等于没有。
查问题根源:Strapi默认的sitemap插件只生成了一个/sitemap.xml,里面全是默认语言的URL参数。我的中文版路由是/zh/xxx,英文是/en/xxx,但sitemap里只放了/en/的。AI爬虫读完一个sitemap就走人了,中文版那些页面连索引都没进去。
手动改。在Strapi后端写个自定义中间件,生成两个sitemap文件:
// 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: 'global::sitemap',
config: {
enabled: true,
resolve: './src/api/sitemap/services/sitemap.js'
}
},
];
然后在services里写了生成逻辑,把中文和英文URL分别写入两个文件。关键配置在robots.txt里:
User-agent: *
Allow: /
Disallow: /admin
Disallow: /api
Disallow: /uploads
Sitemap: https://mysite.com/sitemap-en.xml
Sitemap: https://mysite.com/sitemap-zh.xml
注意sitemap的优先级设置。我给每个页面加了priority: 0.8和changefreq: weekly。中文版首页priority设到1.0。这里有个血泪教训:别用Strapi自带的sitemap插件,它不支持i18n路由分割,必须自己写。
上线后过了4天,核子GEO检测工具显示中文版AI引用率从0.2%涨到4.1%,翻了20倍。英文版从3.8%涨到5.2%。不是立竿见影,但效果明显。
避坑清单
- Strapi v4自带的sitemap插件只处理默认语言,多语言站必须自己写中间件生成独立sitemap
- 每个语言sitemap的优先级分别设置,中文版首页priority设1.0
- robots.txt里每个sitemap必须单独声明,不能只写一个/sitemap.xml
- 更新后等3-7天让AI爬虫重新抓取,别天天看数据焦虑
避坑清单
本地服务搞AI提及率,我踩过的坑比你见过的关键词还多。列几条血泪教训,你对照着看自己中了几条。
1. robots.txt封了Google Maps爬虫
我手贱,在robots.txt加了Disallow: /stores/,想着屏蔽内部测试页面。结果Google Business Profile的爬虫也被挡住了,地图搜索结果里店铺直接消失。用核子GEO的AEO评估跑一遍,发现AI爬虫识别分数从87掉到34,本地3-pack直接没影了。修复后等了11天才恢复。
2. 地图标记只有名称和地址
Strapi后台我偷懒只填了基础字段。核子GEO检测工具的分析报告显示,我的店铺缺少8个必填属性(营业时间、电话、服务标签、评分累计等等),AI生成地图摘要时直接忽略。补全后,本地搜索“附近修空调”的AI引用率从12%跳到41%。
3. 地域词堆砌在标题里
“北京北京北京修水管”这种玩法,以前管用。现在AI引擎直接判定为垃圾内容,我有个站点被降权,索引量从3200掉到890。得用自然语序:“我在朝阳区修水管,15年老师傅”。
4. 忽略Schema标记的本地化
Next.js用next-seo只配了全局Schema,没给每个店铺页单独配LocalBusiness。AI爬虫来抓,识别不了哪个店在哪个区。后来用@graphql-codegen自动生成Strapi数据驱动的JSON-LD,每个页面带GeoCoordinates和areaServed。AI引用率从9%涨到37%。
5. 图片全用WebP但没配Brotli压缩
我纠结了3个月要不要上Brotli。实测结果:nginx配brotli on; brotli_types text/html application/json application/ld+json;,首页体积从12.4KB降到4.1KB,首字节时间从1.2s缩到0.4s。AI爬虫抓取速度提升67%。别像我当初那样犹豫,上。
6. 评论回复用模板“感谢您的反馈”
AI引擎会抓取商家回复作为本地摘要内容。我用千篇一律的回复,导致AI提取的摘要全是废话。改成每条回复带具体关键词,比如“您说的朝阳区双井那台空调,我师傅已经检查过了”。结果AI引用回复内容的几率从3%升到28%。
7. 忽视GEO的“权威提及”信号
本地服务商最容易犯的错:只做自家网站,不做本地媒体提及。AI引擎的权威性评分里,本地新闻网站、政府网站、行业目录的引用权重高得离谱。我花500块让本地生活号写了一篇“朝阳区修水管师傅的10年经验分享”,AI引用率直接涨了15%。