站点刚上线时,一個 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 反而被稀释。