Sitemap 不是提交一次就完事的文件。当站点 URL 數量涨到几萬甚至几十萬,單個 sitemap 會先撞上协议里的硬性上限,再影响蜘蛛讀取這份清單的效率。這时通常需要用到 sitemap index(索引文件)加分片的组织方式。
先看硬性上限:單文件装不下大站
协议给的范围很明确:一個 sitemap 文件最多 50000 條 URL,未压缩体积不超過 50MB。超過就得拆。但很多站点真正的問题不是超限,而是把几萬條 URL 塞在一個文件里——蜘蛛每次来都要完整取一遍,頁面只改動一点点,整份文件的更新時間也跟着變。
索引文件只做一件事:指向分片
sitemap index 里不寫具体 URL,只寫各個子 sitemap 的地址和 lastmod。结构大致包含根节点 sitemapindex,下面每條记錄對應一個 loc 與一個 lastmod。需要注意的是,索引里不能再套索引,子 sitemap 必须是普通 sitemap,不能又是 index 文件。
按什么维度拆片
- 按栏目拆:内容類型差別大时最清晰,某個栏目更新频繁,只影响它那一片。
- 按時間拆:适合更新节奏快的站点,例如新闻按月分片,舊片内容基本不變。
- 按内容類型拆:文章、商品、标簽頁分開,便于單獨观察各類型的抓取表現。
每片的 URL 數量建议留出余量,不要顶到 50000,几萬條以内更容易被完整讀取。片數也不宜過多,几十片通常就够用,拆得太碎反而增加蜘蛛的請求次數。
lastmod 要标到分片這一层
索引里的 lastmod 是告诉蜘蛛這组 URL 有没有整体變化的關键信号。如果分片内容没變却一直刷新時間戳,蜘蛛會逐渐不再信任這個字段;反過来,某片新增了内容却没有更新 lastmod,可能過很久才會被重新讀取。子 sitemap 内部的 lastmod 與索引层的 lastmod 最好保持一致逻辑。
分片地址必须自己能被抓到
- robots.txt 里不要拦掉 sitemap 所在目錄。
- 分片地址返回 200,内容類型為 XML,不要被重定向到別的路径。
- 不要在分片里塞入被 robots 禁止抓取的 URL 或已经下线的頁面。
- 分片里的 URL 尽量與站内連結可達的地址一致,避免地图和内鏈互相矛盾。
怎么驗證拆片有没有生效
更實用的做法是看服務器日誌:索引文件被請求的频率、返回狀態碼、蜘蛛取完分片後是否繼續抓取其中的 URL。如果索引被频繁抓取,但子分片很少被請求,問题多半出在索引里的 lastmod 或分片地址本身。如果分片被正常讀取,其中的新 URL 却迟迟没有進入抓取队列,就该回到内鏈和頁面本身找原因,而不是繼續加 sitemap 條目。
Sitemap 负责告诉蜘蛛這里有什么,内鏈负责證明這些 URL 值得抓。两者缺一,拆得再细的地图也只是一份清單。