站点小的时候,一個 sitemap.xml 就够了。頁面到几萬條以後,單文件會變得又大又难维護,蜘蛛每次来都要下载完整一份,站点自己生成一次也要跑很久。這时通常要做的不是“繼續往一個文件里塞”,而是拆分。
分片不是為了绕開上限
常见的限制是單個 sitemap 文件最多 5 萬條 URL、未压缩体积不超過 50MB。很多人拆分的唯一理由是逼近這個上限,其實更實际的理由是:分片之後,某個栏目更新时只需要重新生成那一片,蜘蛛也只需要重新讀那一片,抓取開销和维護成本都會下来。
反過来,如果站点只有几千條 URL,硬要切成二三十個文件也不划算。每個分片都是一次獨立的請求,索引文件本身也要被抓,切得太碎會白白增加抓取次數。
按什么维度切
- 按栏目或目錄切:博客、商品、帮助中心各一片,和站内结构大致對應,改動范围清晰。
- 按更新時間切:把最近更新的内容單獨成片,适合新闻、活動這類更新频繁的站点。
- 按内容類型切:文章、图片、视频、专题各一片,方便單獨提交和排查。
- 不推荐按字母或 ID 区間机械切分,除了數量均匀之外没有別的意义。
一個常见做法是“全量片 + 增量片”:全量片覆盖所有可索引 URL,增量片只放近期更新或新增的 URL。全量片更新频率低,增量片更新频繁,蜘蛛两次来訪之間看到的變化會更集中。
索引文件怎么寫
分片多了之後,需要一個 sitemap index 文件把它們列出来,路径通常是 /sitemap.xml。索引文件里的每個 sitemap 條目只寫 loc 和可選的 lastmod,不要寫 priority、changefreq 這些頁面級字段。
索引文件本身也是被抓取的對象。它寫得越干净,蜘蛛越容易顺着它把分片排進队列。
- loc 要用绝對地址,並且和文件實际可訪問的地址一致,不要经過跳轉。
- 分片的 lastmod 與實际内容更新時間對齐,不要每次生成 sitemap 都刷新成目前時間。
- 索引嵌套层數別太深,一般一层索引指向分片就够了。
- 分片文件用 gzip 压缩没問题,注意 50MB 的限制是按未压缩体积算的。
几個容易忽略的点
- 只放返回 200 且允许索引的 URL。被 robots 屏蔽、需要登入、參數重复的地址不要寫進去,寫了也只是让蜘蛛白跑一趟。
- 一個 URL 只出現在一個分片里,重复會让蜘蛛反复判断该用哪條。
- 分片里的地址最好和站内連結能互相印證。如果某個 URL 只存在于 sitemap、站内没有任何入口,它的抓取優先級通常不會高。
- 站点改版後,舊分片要及时替換,別让已经 404 的地址繼續留在索引文件里。
怎么知道分片有没有被讀
看服務器日誌里 sitemap 相關路径的請求情况:哪些分片被請求過、频率如何、返回狀態是否正常。如果某個分片長期没人訪問,先检查它是否被索引文件正确引用,再看 robots.txt 是否挡住了路径。
sitemap 的定位是补充入口,不是替代内鏈。它告诉蜘蛛“這些地址存在”,但一個頁面能不能被稳定抓取、會不會被当作重要頁面,更多還是取决于站内連結和内容本身。两者配合,入口才會稳。