站点還小的时候,一個 sitemap.xml 就够用;当 URL 數量涨到几萬甚至几十萬,單份文件就會撞上大小和條數的上限。蜘蛛每次取回的只是其中一段,剩下的 URL 迟迟進不了發現队列。這时候要做的不是把文件寫得更長,而是把它拆成一張索引加多個分片。
先搞清楚上限在哪
主流搜尋引擎對單份 Sitemap 有两條硬限制:文件体积(未压缩前一般在 50MB 量級)和 URL 條數(一般 5 萬條)。两者任意一條超了,超出部分就不會被讀取——注意是不會讀取,不是报错。很多站点以為自己提交了全量地图,其實後面的内容從第一天起就没被看到。
压缩成 .gz 可以绕過体积問题,但條數上限绕不過去。所以 URL 上萬之後,分片就是必選項。
sitemap index:一張總目錄
索引文件本身也是一份 Sitemap,只是里面列的不是頁面 URL,而是各個分片文件的地址。它放在站点根目錄下比較自然,例如 /sitemap_index.xml。结构上每個分片用一個 sitemap 标簽包裹,可以带上该分片自己的 lastmod。
几個容易踩的点:
- 索引文件同样受体积和條數限制,分片數量別失控,几百個通常已经很多了。
- robots.txt 里只需要声明索引文件這一條 Sitemap 指令,不用把每個分片都寫進去。
- 索引里引用的分片必须真實可訪問、返回 200,否則蜘蛛會跳過,甚至降低對整份地图的信任。
分片按什么维度切
切法没有唯一答案,但最好让每個分片有清晰的含义,方便日後定位問题:
- 按栏目或内容類型:商品、文章、专题各自一份,出問题时能快速缩小范围。
- 按更新時間滚動:單獨留一份“最近更新”分片,只放近段時間有變動的 URL,方便蜘蛛優先回訪。
- 按語言或地区目錄:多語言站点按目錄切,和 hreflang 的划分保持一致。
實际使用中常见的是混合策略:主力分片按栏目拆,再加一份時間维度的小分片承载新内容。
哪些 URL 不该放進分片
地图里塞的每一類無效 URL,都在消耗蜘蛛有限的抓取机會:
- 带篩選參數、排序參數产生的變体頁面。
- 已经設定 noindex、被 robots.txt 屏蔽的地址。
- 會 301/302 跳走的舊 URL,直接寫最终地址即可。
- 返回 404 或内容空壳的软 404 頁面。
- 需要登入才能看到的頁面。
把這些清掉,地图整体的“命中率”會好看很多。
维護时的几個细节
lastmod 要寫真實修改時間。如果每次生成地图都把所有分片的時間刷成目前时刻,這個字段就失去了參考價值。分片内部的 lastmod 保持真實,分片本身的 lastmod 取该批頁面里最新的一個即可。
分片之間不要互相重复。同一個 URL 出現在多份分片里不會带来額外好處,反而让統計口径變乱。
生成過程要稳定。地图是静態文件的话,尽量在發布流程里一次性寫好,避免出現半截文件或者某次發布後分片全部缺失。
地图解决的是“蜘蛛能不能發現這個 URL”,它不决定頁面值不值得被展示,也不替代站内連結。
地图是补充,不是主路径
蜘蛛在站内的主要移動方式仍然是跟随連結。Sitemap 的作用更像一份候补名單:内鏈走不到的角落頁面,可以靠它被發現。所以不要因為有了地图,就放松導航、面包屑和列表頁的铺设。
上线後的检查與观察
- 用浏览器和命令行分別訪問索引文件與每個分片,確認返回 200、内容類型正确、没有被 CDN 或 WAF 拦下。
- 在 robots.txt 中確認只声明了索引文件,且路径與實际一致。
- 提交後等一段時間,從服務器日誌里看蜘蛛訪問各分片的频率,判断哪部分被優先處理。
- 在 Search Console 的 Sitemap 报告里核對“已發現 URL 數”和站点實际 URL 數的差距,差得多說明有分片没被讀到。
- 定期清理分片里的失效地址,尤其是做過分頁或下架内容之後。
站点規模越大,地图越像一份需要長期维護的清單,而不是一次性任務。把它切清楚、保持干净,蜘蛛的 URL 發現過程才會顺畅一些。