搜尋抓取

Sitemap 索引與分片:站点變大後,怎么让地图本身不拖後腿

單份 sitemap 有大小和條數上限,站点一大就會被截断。本文讲清 sitemap index 的作用、分片该按什么维度切、哪些 URL 不该塞進分片、lastmod 怎么维護,以及上线後從日誌和 Search Console 里怎么看蜘蛛取地图的情况。

搜尋抓取

Sitemap 索引與分片:站点變大後,怎么让地图本身不拖後腿

站点還小的时候,一個 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 的作用更像一份候补名單:内鏈走不到的角落頁面,可以靠它被發現。所以不要因為有了地图,就放松導航、面包屑和列表頁的铺设。

上线後的检查與观察

  1. 用浏览器和命令行分別訪問索引文件與每個分片,確認返回 200、内容類型正确、没有被 CDN 或 WAF 拦下。
  2. 在 robots.txt 中確認只声明了索引文件,且路径與實际一致。
  3. 提交後等一段時間,從服務器日誌里看蜘蛛訪問各分片的频率,判断哪部分被優先處理。
  4. 在 Search Console 的 Sitemap 报告里核對“已發現 URL 數”和站点實际 URL 數的差距,差得多說明有分片没被讀到。
  5. 定期清理分片里的失效地址,尤其是做過分頁或下架内容之後。

站点規模越大,地图越像一份需要長期维護的清單,而不是一次性任務。把它切清楚、保持干净,蜘蛛的 URL 發現過程才會顺畅一些。