站点 URL 数量到一定规模后,单个 Sitemap 文件会触到 5 万条 URL 或 50MB 未压缩大小的上限。这时候就需要用 Sitemap 索引文件把多个子地图串起来。索引文件本身不直接列页面,它列的是子地图的地址。
什么时候需要索引文件
不是所有站点都要拆。几百到几千条 URL,一个 Sitemap 足够。当 URL 上万、且分散在不同栏目、语言或站点模块时,拆成索引加子地图更好管理。拆分的意义不只是绕过大小限制,还包括让抓取日志更好对照:某个子地图的抓取频率异常时,能快速定位到对应目录。
子地图按什么维度拆
- 按栏目或目录:文章、商品、帮助中心各自成图,URL 集合边界清楚。
- 按更新频率:把每天更新的内容与历史归档分开,方便给不同 lastmod 策略。
- 按语言或地区:多语言站点分开后,抓取表现和索引情况更容易分开看。
- 按稳定性:已稳定不再变动的老页面可以单独归档,减少对高频子地图的干扰。
拆分维度尽量和站内目录结构一致。如果子地图里的 URL 跨越很多不相关目录,日志分析的价值会下降。
索引文件的写法和注意点
索引文件的根元素是 sitemapindex,内部每一项用 sitemap 包裹,包含 loc 字段指向子地图地址,可选带 lastmod。子地图本身则是 urlset,包含一组 URL 条目。两者的结构和用途不同,不能混写。
注意索引文件里只能列子地图,不要再把普通页面 URL 塞进去;同一层索引通常不要嵌套第二层索引,层级越多,蜘蛛到达具体 URL 的链路越长。子地图地址建议用绝对地址,且不带会话参数或跟踪参数。
蜘蛛读索引与子地图的节奏
蜘蛛发现索引文件后,会按其中的子地图地址逐个请求。多数情况下不是严格按文件里的顺序,而是结合子地图上次的表现、更新时间和站点整体抓取预算来安排。一个长期没有变化、返回内容也正常的子地图,回访间隔会拉长;新提交或刚更新过的子地图,通常会更快被取一次。
因此子地图数量要克制。把一万条 URL 拆成一百个文件,意味着蜘蛛要多发约一百次请求才能拿到同一批地址,抓取预算会被额外消耗。常见做法是每个子地图保持在几千到几万条之间,数量增长后再考虑继续拆。
索引文件解决的是组织问题,不改变蜘蛛是否愿意抓取。真正决定回访的,还是页面本身是否值得更新和抓取。
几个容易踩的坑
- 子地图返回 200,但内容为空或只返回首页,蜘蛛会认为这批 URL 没有有效信息。
- 子地图地址做了重定向,或者大小写、尾斜杠和 robots.txt 里声明的不一致,导致索引读到的是另一条地址。
- lastmod 全部写成当前时间,之后又长期不更新,时间戳会失去参考意义。
- 把 noindex 的页面大量放进子地图,抓取请求会被消耗,但页面并不会进入索引。
- 索引文件和子地图更新时间不同步,索引里指的地址已经换了名字。
和内链、robots.txt 的配合
Sitemap 是 URL 发现的一条补充路径,不是唯一路径。站内链接仍然是把蜘蛛带到深层页面的主要方式。对于内链很难触达的页面,子地图可以提供入口;但对于主要栏目和详情页,稳定的导航、列表页和正文链接更值得投入维护。robots.txt 里声明 Sitemap 地址时,确保该地址可公开访问且返回正常状态码。
检查时可以用日志按子地图路径分组,看每个子地图的抓取次数和返回状态是否正常。如果某个子地图长时间没有抓取记录,先确认它是否被索引文件正确引用、地址是否可访问,再考虑是否需要调整拆分方式。抓取表现是观察结果,不是可以单方面约定的指标。