站点地图(sitemap)的作用很朴素:把站点希望被發現的 URL 整理成一份清單,放在固定位置,让蜘蛛来取。它不承诺收錄,也不代表提交了就會被抓取,但它是少數几個由站点主動發起、成本又很低的沟通渠道。問题在于,很多站点的 sitemap 是建站时自動生成的一版,之後栏目調整了、地址改寫了、内容下线了,文件却一直躺在服務器上没動過。
先確認這份文件有没有真的在被讀
自查的第一步不是改内容,而是確認這條鏈路是通的。如果文件本身打不開,後面做什么都白費。
- 直接用浏览器或命令行請求 sitemap 地址,確認返回 200,而不是 404、403 或者被跳轉到一個 HTML 頁面;
- 確認返回的内容類型是 XML,而不是被服務器当成普通文本或下载文件;
- 在搜尋引擎的站長後台提交一次,观察後續的抓取與索引資料是否有變化;
- 到服務器日誌里搜一下 sitemap 的文件名,看看蜘蛛最近有没有来取,频率如何。
如果日誌里長期没有任何抓取记錄,常见原因是 robots.txt 里没有声明 Sitemap 地址,或者声明了一個已经失效的路径。這一行寫错,後面所有维護都等于零。
提交范围:哪些地址不该寫進去
sitemap 不是「越多越好」的清單。放進去的每一條地址,都相当于在告诉蜘蛛「這個值得花時間看」。以下這些類型通常不值得占位:
- 會批量生成地址的參數頁,比如排序、篩選、會话跟踪參數,一個列表頁可能派生出成百上千條组合;
- 返回 404、410 的失效地址,以及還在做 301、302 跳轉的舊地址,應该提交跳轉後的目标地址;
- 設定了 noindex 的頁面,一邊说不让索引,一邊把地址列進 sitemap,属于自相矛盾的信号;
- 需要登入才能訪問的頁面,蜘蛛取不到内容,只會消耗抓取预算;
- 已经被 canonical 指向別處的重复副本,以及測試域名、分站镜像里的同一篇内容。
把這些地址清出去,sitemap 的總量會明顯下降,剩下的條目反而更容易被抓取到。
lastmod 要真實,其他字段不用纠结
lastmod 是 sitemap 里少數仍被參考的字段,它的價值建立在一個前提上:時間戳反映的是頁面内容的實际改動,而不是文件生成的時間。如果每次程序跑一遍就把所有地址的時間戳刷成当下,這個字段很快就會被忽略。
比較稳妥的做法是让 lastmod 来自内容表的更新時間字段,只有正文确實改動时才更新。至于 changefreq 和 priority,主流搜尋引擎早就明确表示不太參考,不值得為它們反复調參。
分片、數量與多語言處理
- 單個 sitemap 文件通常建议控制在 5 萬條 URL、未压缩 50MB 以内,超出部分用 sitemap 索引文件把多個分片串起来;
- 按内容類型分開更利于排查,文章、商品、视频、图片各自一個文件;
- 多語言站点可以按語言各出一份,並在頁面里用 hreflang 做好對應,不建议把多個域名的地址混進同一個文件;
- 索引文件本身也要能被直接訪問,且不要嵌套過深,保持两三层以内。
一份可以照着走的自查流程
- 拉取 sitemap 中的全部地址,抽样或全量請求,记錄狀態碼分布;
- 筛出 3xx、4xx、5xx 三類地址,分別確認是跳轉未更新、頁面已下线還是服務器異常;
- 抽查頁面的 meta robots 與 canonical,看是否與 sitemap 的意图一致;
- 對比 lastmod 與頁面正文的實际更新時間,確認没有整批刷新的情况;
- 核對分片數量與索引文件,確認没有遗漏或重复收錄;
- 检查 robots.txt 中的 Sitemap 声明,並到搜尋後台確認最新提交時間;
- 把上述检查结果寫進固定的生成流程,让 sitemap 跟着内容系統自動更新,而不是靠人工定期重做。
把 sitemap 当成一份需要跟着站点一起演進的清單,而不是一次生成就永久生效的静態文件。它不需要频繁改動,但需要有人定期看一眼。
最後提醒一点:清理 sitemap 之後,索引量和抓取量未必立刻有變化,它解决的是信号一致性的問题——让蜘蛛把有限的抓取額度用在你真正想让人看到的内容上。這件事没有捷径,但检查一遍的成本,通常比事後排查收錄異常要低得多。