站点 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 地址时,确保该地址可公開訪問且返回正常狀態碼。
检查时可以用日誌按子地图路径分组,看每個子地图的抓取次數和返回狀態是否正常。如果某個子地图長時間没有抓取记錄,先確認它是否被索引文件正确引用、地址是否可訪問,再考虑是否需要調整拆分方式。抓取表現是观察结果,不是可以單方面约定的指标。