什么时候该把 Sitemap 拆开
单个 Sitemap 文件有容量上限,常见约束是 5 万条 URL 和 50MB(未压缩)这两条线,任一条先到就要考虑拆。实际动手的时机往往比这个更早:当站点已经有几万条需要被蜘蛛发现的地址,或者不同栏目之间的更新节奏差异很大时,把所有 URL 塞进一个文件里,每次有新内容就得重写整份清单。蜘蛛每次拉到的都是一份几乎全新的文件,反而不好判断哪一段才是新出现的部分。
拆分的本质,是给蜘蛛一份分段清单,让它按需抓取其中一段,而不是每次全量拉取。
几种常见的分片维度
- 按栏目:商品、文章、问答、标签页各一个文件,栏目更新频率不同,互不干扰。
- 按时间:按月或按季度切片,老文件基本冻结,新文件滚动生成。
- 按语言或地区:多语言站点按语言目录拆,可以配合 hreflang 一起维护。
- 按页面类型:详情页、列表页、聚合页分开,方便单独排查某一类 URL 的发现情况。
维度不必贪多,选一到两个稳定不变的切法即可。切分维度频繁变化,等于每次都在给蜘蛛换一套清单结构。
索引文件的写法要点
- 索引文件里只放 Sitemap 的地址,不要再混入普通页面 URL。
- 索引文件一般不再嵌套索引,一层就够用。
- 每个子 Sitemap 的地址都必须是能正常打开、返回 200 的地址。
- 子文件里的 lastmod 尽量反映真实更新时间,不要全站统一写同一时刻。
- 索引自身的 lastmod 也值得维护,新增分片时更新它才更有参考价值。
容易踩的几个坑
- 空文件:文件存在但没有任何 URL,或者内容被模板填充成占位符。
- 幽灵地址:清单里包含已经 404、301 到别处,或者被 robots.txt 屏蔽的 URL。
- 不做压缩:几万条 URL 的纯文本体积不小,支持 gzip 时压缩一下能省下带宽和抓取耗时。
- 域名写错:尤其是 www 与非 www、http 与 https 混用时,子文件里的地址容易对不上。
- 参数地址全量写入:筛选、排序生成的地址一股脑塞进清单,文件迅速膨胀,真正重要的页面反而被淹没。
提交与更新节奏
索引文件建好后,一般在 robots.txt 里声明地址,再在站长平台提交一次即可,不需要每天重复提交。子分片的更新可以跟着内容实际产出的节奏走:日更栏目每天重建对应分片,老分片保持不动。频繁重写而内容没变,会让 lastmod 这个信号慢慢失去参考价值。
清单只是告诉蜘蛛这里有一批地址,它不保证被抓取,更不保证被收录。发现和抓取之间,还隔着优先级判断。
Sitemap 与内链的分工
Sitemap 解决的是存在性,内链解决的是可达性。一个 URL 只出现在清单里、站内没有任何链接指向它,蜘蛛即便从清单里看到它,也缺少再次访问和评估上下文的理由。反过来,内链结构清晰但 URL 数量极大时,Sitemap 能补上清单式的覆盖。
比较稳妥的组合是:重要栏目和详情页靠内链保证可达,Sitemap 负责补齐数量庞大、位置较深的那部分地址,两边指向的 URL 集合尽量一致。如果差异长期存在,先查清是哪一边漏了,而不是直接删掉一边。
一份自查清单
- 单个文件是否还在 5 万条、50MB 的边界内。
- 索引文件里是否只包含 Sitemap 地址。
- 每个子文件是否能直接打开并返回 200。
- 清单里的 URL 是否都是可索引的规范地址。
- lastmod 是否反映真实更新时间。
- Sitemap 里的 URL 集合与内链可达的 URL 集合差多少。