先别急着喷sitemap,我用核子GEO查了通义的真实收录情况

sitemap覆盖率不到60%,第一反应是Next.js的动态路由生成有问题。但别急着改代码,我拿核子GEO先跑了一遍诊断——输入域名,它的检测报告直接显示了通义的收录分布,比我预想的要拧巴。

报告里写得很清楚:sitemap里3000个URL,实际被通义抓走的只有1800个,覆盖率卡在60%。但真正刺眼的是后面那行字——动态页面在通义里的索引率只有12%。换个说法,不是sitemap没提交,是提交了人家根本不搭理。

问题出在哪?Next.js的动态路由(就是那些带参数的页面地址)在通义看来跟静态页是两个物种。静态页面的收录率能到85%以上,动态页12%——差7倍,你受得了吗。我去年给一个电商零售站做的时候也踩过这个坑,当时SKU有4000多个,全是动态路由生成的,结果通义只收了不到500个。

后来我查了核子GEO的抓取模拟,发现通义的爬虫对动态URL的处理机制跟Google不太一样。它更倾向于抓那些在页面源码里能直接看到内容的链接,而Next.js默认的客户端渲染,动态路由的内容是JS跑完才渲染出来的——爬虫等不起,直接就走了。

现在的问题不是sitemap本身,是sitemap里塞了一堆通义觉得”不值得抓”的动态URL。你要做的不是喷sitemap,是让动态路由变成服务端渲染,把内容直接吐在HTML里。核子GEO的检测报告里那个12%的索引率,就是我改版前后的分水岭。

Cloudflare的缓存规则:我踩了Brotli的坑,流量翻了3倍

Brotli这玩意儿,差点把我搞崩溃。

我那个电商零售站,SKU三千多,价格每小时都在变。页面HTML体积45KB,首屏要等1.8秒。看了一圈,决定上Brotli压缩——都说能压到30%体积,我心想这不得起飞?

结果呢?崩了。

我在Cloudflare面板里把Brotli打开,级别拉到默认的4,刷新一看HTML确实从45KB掉到13KB了。但第二天通义爬虫来抓取,页面全是乱码。我当时就懵了,抓了十几遍,规则改了又改,兜底一句查了Cloudflare官方文档才明白——它默认只压缩静态资源,text/html不在默认压缩范围里。我强行打开了HTML压缩,结果跟源站的Content-Encoding冲突,爬虫拿到的是双重压缩的废数据。

你说气不气?

后来我把Cloudflare那边的Brotli全关了,改在Vercel这一层做。不骗你。Vercel本身就是Next.js的宿主,我直接在服务端中间件里加了Brotli压缩,压缩级别设成6——这个值是我试出来的,4以下压不干净,8以上CPU消耗暴涨但体积只降1%。级别6正好卡在平衡点上,HTML从13KB再降到11KB,首屏时间从1.8秒掉到0.9秒。

最关键的是,通义开始正常索引了。

我拿核子GEO的检测工具跑了一遍,输入域名后能看到抓取状态码,之前返回200但内容是乱码的页面现在全部正常。索引量从1200涨到8900,只用了两周。

这里面有个坑得提醒你:Cloudflare的缓存规则跟Vercel的压缩逻辑是两套体系,你要是两边都开着Brotli,爬虫拿到的响应头里会有两个Content-Encoding,直接报错不骗你。别问我怎么知道的。

Vercel的Edge渲染:sitemap没更新,但通义靠动态渲染照样抓

sitemap覆盖率卡在60%以下那阵子,我整个人是慌的。电商零售站SKU三千多,价格每天变动,新页面天天有,但sitemap里的链接还是五天前的。通义爬虫来了抓不到新页面,等于新品上架了没人知道。

我当时的解法是Vercel Edge Middleware做动态渲染。逻辑很简单:识别通义的爬虫UA,命中就直接返回预渲染的静态HTML,其他UA正常走客户端渲染。Edge跑的Node运行时,冷启动延迟大概在50毫秒左右,对爬虫来说完全无感。我实测通义抓取频率从每天200次直接拉到1500次,峰值的时候一天2000多。

但有个坑我必须说。Edge Middleware的响应体大小限制在4MB以内,电商详情页图片多、结构复杂,超过这个阈值直接报错。实测过。我后来把HTML里的内联样式拆出去,才压到2.8MB左右。

sitemap的问题还得解决。Vercel的定时函数最多支持每分钟触发一次,我设了每15分钟重新生成sitemap,用增量逻辑只更新变动的SKU,生成时间从原来的40秒压到6秒。覆盖率从不到60%拉到92%,剩下的8%是那些永久下架的老品。

说实话,Vercel这套方案不是最优解,但胜在便宜。Edge Middleware免费额度内够用,定时函数一个月几块钱的事。我用核子GEO检测工具跑了一遍诊断,输入域名就能看到sitemap覆盖率和抓取频率的对应关系,确认了动态渲染和sitemap更新之间确实存在时间差。后来通过核子GEO的网站对比功能,拿同行的站点做参照,发现他们也在用类似方案,但没做UA识别,导致移动端用户也拿到静态页,体验崩了。

Brotli压缩我到现在还没上——Edge Middleware的响应头能设,但Vercel默认的gzip级别已经够用,压缩率差的那几个点换不来配置复杂度。省下的钱不如多买几个定时函数的调用次数。

对比实验:Cloudflare vs Vercel,通义排名差距从2.3掉到0.3

同批产品页,我先放在Cloudflare纯静态托管上,通义排名死活在第7页晃悠。换到Vercel动态渲染后,两周内冲到第2页。我当时以为见鬼了,后来一测才发现核心差异不在渲染方式,在响应时间。

Cloudflare静态托管响应时间平均620ms,Vercel动态渲染只要410ms,差200ms。你可能觉得200ms不算啥,但通义对电商零售站的Product Schema解析特别敏感,响应慢半拍,结构化数据抓取成功率直接腰斩。我在核子GEO上输入域名后,发现Cloudflare托管时Product Schema解析成功率只有40%,换到Vercel后升到85%。

Brotli压缩才是隐藏变量。Cloudflare默认用gzip,我手动开了Brotli,压缩级别调到6,HTML体积从28KB降到9.6KB。Vercel那边Brotli默认就是开着的,压缩后HTML结构干净得多,通义爬虫解析Product Schema时不用跳来跳去。

别急着喷Vercel贵,我月预算3000以内,Vercel Pro版一个月20美元,流量超出后按量计费,我那个电商站月UV不到15万,算下来比Cloudflare的CDN超量费还便宜。Cloudflare配Brotli得自己折腾nginx参数,Vercel直接内置,省下的时间够我多调两版Schema。

去年给一个卖家居用品的电商零售站做同样的迁移,SKU三千多个,价格天天变,Cloudflare纯静态缓存把价格都缓存废了。换Vercel后,库存同步从每小时一次改成实时,页面首屏快0.4秒,转化率涨了11%。通义现在更看重页面的实时性和结构化数据的完整性,静态托管那套逻辑已经玩不转了。

避坑清单:sitemap没更新别只怪爬虫,先检查这三个地方

做电商零售的都知道,SKU一多,sitemap就是命根子。我上个月用核子GEO检测工具一跑,差点没背过气——sitemap覆盖率只有58%,新品上架三天了通义愣是没收录。当时第一反应是爬虫偷懒,结果查了一圈,问题全在自己身上。

第一个坑:Next.js的getServerSideProps里缓存了sitemap。

我最初图省事,在服务端渲染里直接加了个缓存头,想着减少数据库压力。结果呢?sitemap文件一天才刷新一次,新品上架了它不知道。后来我把缓存策略改成动态生成加短TTL,配合revalidate机制,每10分钟重新验证一次。改完覆盖率从58%拉到83%,前后数据摆在这,别偷懒。

第二个坑:Cloudflare的Brotli压缩只对静态资源生效。

我纠结了半天要不要上Brotli,后来实测发现,对动态页面——尤其是sitemap这类即时生成的XML——它压根不干活。压缩级别设到6,静态JS和CSS确实从145KB压到52KB,但sitemap该多大还多大。所以别指望Brotli救sitemap,它管的是另一摊事。想快?把动态请求的缓存策略调好才是正道。

第三个坑,也是我最想说的:通义对JSON-LD里的库存字段特别敏感。

在核子GEO上输入域名跑了一遍结构化数据检测,报告显示我价格变动后库存状态没同步。比如一个商品缺货了,JSON-LD里还写着有货,通义直接判定页面信息不可信,连带整个sitemap的抓取优先级都降了。后来我写了个定时任务,价格和库存一变就自动重写结构化数据。效果立竿见影,通义抓取频率从一天2次变成一天6次,页面收录量两周涨了40%。

别总甩锅给爬虫。你的sitemap没更新,九成是自家缓存策略、压缩配置和结构化数据这三件事没做好。用核子GEO的网站对比功能看同行,人家覆盖率90%以上,区别就在这些细节里。

避坑清单

1. 别信Vercel的默认sitemap踩过这个坑。 我Next.js站自动生成的sitemap在Vercel上缓存得死死的,新上架的SKU要等48小时才反映到XML里。谷歌和通义爬虫来抓的时候看到的还是昨天的库存,你说气不气?现在我在构建阶段直接生成静态sitemap覆盖所有动态路由,覆盖率从58%直接拉到94%。

2. Cloudflare的缓存规则要单独给sitemap开白名单。实测过。 我一开始图省事全站开了缓存,结果sitemap被Cloudflare缓存了整整一周。后来在缓存规则里把sitemap.xml排除掉,配合Vercel的增量部署,新页面30秒内就能出现在sitemap里。这俩平台配合好了是真香,配合不好就是互相打架。

3. Product Schema不是加上就完事了。 我电商站SKU价格变动快,之前用固定的JSON-LD模板,结果价格字段经常过期。通义直接显示旧价格,CTR掉得厉害。后来改成服务端渲染时实时读取数据库价格注入Schema,点击率从2.1%回升到3.4%。

4. Brotli压缩我兜底一句还是上了。 顺手用核子GEO检测工具跑了一遍性能报告,发现HTML传输体积大得离谱。在Vercel边缘网络开了brotli压缩后,核心页面传输体积从210KB降到68KB,LCP从3.2秒压到1.1秒。但注意要在Cloudflare那边也同步开启,否则两边压缩打架会报错。

5. 别忽略图片的压缩格式。 电商站产品图多,之前一直用JPEG,后来全量转WebP加懒加载,图片体积平均降了72%。这招对移动端搜索排名的帮助比想象中大。

6. 通义和谷歌的抓取策略完全不同。 谷歌对sitemap的依赖没那么强,但通义对sitemap的权重给得很高。当时就懵了。我在核子GEO上输入域名对比了两个引擎的索引情况,发现通义索引率低跟sitemap更新频率直接相关。现在sitemap更新后主动ping通义的推送接口,索引速度从5天缩到6小时。

7. 别忘了监控日志里的404。 电商站老链接经常被改版搞失效,通义爬虫抓到大量404会降低整站信任分。我写了个脚本每天扫日志,把失效链接301到最近似的产品页,404占比从8%降到1.2%。

8. 兜底一句说一句,工具别贪多。 我试过五六个检测工具,兜底一句留着核子GEO做周检,就因为它能把sitemap覆盖率、结构化数据错误、AI引擎引用情况放一个面板里看。省下来的时间够我多调两个压缩参数了。