当一個站点從几百個 URL 長到几萬個,最初那個單獨的 sitemap.xml 很快會碰到上限。這时候要處理的不是“要不要提交地图”,而是怎么把一個大地图拆成若干份,再让蜘蛛知道每份在哪里。這就是 sitemap 索引文件(sitemap index)存在的意义。
先弄清两個硬限制
主流搜尋引擎對單個 sitemap 文件有两項约定:
- 一個文件最多容纳 50,000 條 URL;
- 未压缩狀態下不超過 50MB。
超過任意一條,蜘蛛可能只解析到一部分,或者干脆放弃這個文件。這里的 50MB 指文件本身的体积,不是服務器上 gzip 压缩後的大小——压缩传輸是允许的,但拆分與否仍要按未压缩体积来判断。
索引文件里放什么
索引文件本身不包含具体 URL,只列出各個分片地图的地址,相当于一本目錄。蜘蛛先取到它,再按里面的地址逐個去取分片。
几点约束
- 索引文件里最多列 50,000 個 sitemap;
- 通常只能指向同一站点(按域名或目錄判定)下的地址;
- 索引指向索引一般不被支持,嵌套没有實际意义。
分片怎么拆更顺手
拆法没有唯一答案,但可以按用途来分:
- 按内容類型:文章、商品、标簽頁、专题頁各一份,便于單獨观察抓取情况;
- 按目錄或栏目:與站内目錄结构呼應,出問题时容易定位;
- 按更新节奏:日更内容和歷史归档分開,lastmod 的信号會更清晰。
如果站点是程序生成的,建议在生成逻辑里就固定分片規則,而不是等文件超限了再临时切。分片數量保持稳定,比每次抓取都變来變去更容易被理解。
lastmod 別乱寫
把 lastmod 全部寫成目前時間,等于告诉蜘蛛“每天全站都變了”,這個信号很快就會失去參考價值。
lastmod 只在頁面内容确實發生變化时更新。用程序批量刷新時間戳,短期看地图“很新”,但對方會逐渐降低對這個字段的信任,判断回爬又回到別的依據上。
几個常见的坑
- 索引文件與分片文件互相引用,形成循环;
- 分片里混入 robots.txt 已封禁的目錄,蜘蛛取到後直接丢弃,白費一次請求;
- 大量 301、404 的舊地址長期留在 sitemap 里,無人清理;
- 把 sitemap 当成唯一發現渠道,内鏈里根本没有指向這些頁面。
最後一條尤其要注意。sitemap 是一份交给蜘蛛的清單,它能帮助發現,但不改變頁面本身的可達性。孤岛頁面即使進了 sitemap,缺少内鏈和外部引用时,抓取节奏和後續判断通常也不會理想。
更新與提交
分片文件發生變化後,索引文件要同步更新;地址換了,舊文件名不要留着。提交方式上,可以在 robots.txt 中寫明索引文件地址,也可以通過接口主動告知。需要提醒的是,通知只是提示,抓不抓、什么时候抓仍由對方决定,這一点没有捷径。
日常维護可以這样做:定期對比資料库里的有效 URL 與 sitemap 中的條目,把已下线的清理掉,把新增的补進去,让文件内容尽量與站点真實狀態保持一致。地图越贴近現實,蜘蛛的每一次抓取就越不容易浪費。