站点刚上线时,一个 Sitemap 文件就能放下所有 URL。等栏目、商品、文章累积到几万条,文件体积和单个文件上限就会成为问题。这时候通常会用 Sitemap 索引文件,把 URL 清单拆成若干分片,再交给搜索引擎。
为什么需要索引文件
主流搜索引擎对单个 Sitemap 有数量与体积的限制,常见是 5 万条 URL、50MB 未压缩。超过之后,文件可能被截断,或者只读取到一部分。索引文件本身只列分片地址,不列具体页面,这样可以把几万、几十万条 URL 分散到多个文件里。索引文件还可以嵌套,但层级越多,抓取时需要的跳转也越多。对大多数站点来说,一层索引加若干分片就够了。
分片怎么切更实用
切分方式没有唯一答案,但可以按站点实际的更新节奏来定:
- 按栏目或内容类型:新闻、商品、帮助文档分开。某一类出问题时,影响范围可控。
- 按更新时间:把最近更新的页面放在一个分片里,历史页面放另一个。蜘蛛回访时能优先看到变化。
- 按 URL 状态:只放返回 200 且可被抓取的地址,重定向、noindex、参数页不要混进去。
分片数量不必追求整齐。关键是每个分片里的 URL 都能独立被抓取,不会因为一个文件太大而拖慢整体读取。
写分片时容易忽略的细节
- URL 用绝对地址,包含协议和域名,不要写相对路径。
- lastmod 尽量反映真实修改时间,不要每次生成都刷新成当天。
- 分片里的页面如果设置了 noindex,等于把矛盾信号一起交出去。
- 不要放需要登录、需要 POST、带会话 ID 的地址。
- 分片文件本身要能稳定返回,不要用动态脚本临时拼装,避免超时。
索引文件与内链的分工
Sitemap 解决的是“告诉蜘蛛有哪些 URL”,内链解决的是“这些 URL 在站内处于什么位置”。只靠清单提交、站内没有任何入口的页面,即使被抓到,也比较难持续获得回访。比较稳妥的做法是:重要页面既有内链入口,也出现在 Sitemap 分片里;次要但需要被发现的页面,至少保证一个入口。
如果 Sitemap 里的地址和内链指向的地址写法不一致,比如带不带斜杠、大小写不同,蜘蛛会把它当成两个入口处理,抓取路径也会分散。生成分片前,先确认站内链接和 canonical 的写法已经统一。
从日志里看分片有没有被走通
Sitemap 提交之后,不能只看“已提交”状态。可以看服务器日志里索引文件和分片文件的请求次数、返回码,以及分片里的 URL 随后有没有被抓取。如果索引文件经常返回 5xx 或超时,分片自然不会被继续读取。如果分片被读取,但里面的 URL 长时间没有抓取记录,就要回到内链和页面状态上找原因。
分片只是把 URL 清单交出去的方式,它不改变页面本身是否值得抓取。清单交得再整齐,页面返回异常或没有入口,路径还是走不下去。
最后提醒一点:分片数量增加后,维护成本也会上升。生成逻辑要能自动排除已下线、已合并、已跳转的地址,否则清单会越滚越大,真正需要抓取的 URL 反而被稀释。