很多站点上线时會在 robots.txt 里寫一行 Sitemap 地址,然後這件事就再也没有被提起過。半年後回头看,那個 XML 文件里還留着已经下线的栏目、改過路径的舊地址,以及一堆 lastmod 停在上线当天的记錄。蜘蛛照样會来,但它拿到的是一份過期的地图。
站点地图解决的是什么問题
站点地图不保證收錄,也不提升排名,它的作用只有一件事:告诉抓取端這里有哪些地址、以及大概什么时候更新過。對于連結层級深、内鏈稀疏,或者新頁面一时半會儿進不了導航的站点,它是一個比較可靠的补充渠道。如果站点本身结构扁平、内鏈完整、蜘蛛每天都来,那站点地图的重要性會下降,但维護成本也很低,没有理由放着不管。
分片與索引文件
單個 sitemap 文件有地址數量和体积的上限,一般按 5 萬條 URL、未压缩 50MB 来規划。超過之後不是能不能提交的問题,而是抓取端可能讀不完或者干脆放弃。常規做法是按栏目、按内容類型或者按時間切分,比如文章、商品、专题各一個文件,再用一個 sitemap 索引文件把它們列出来。索引文件本身不要再嵌套索引,层級越浅越好。
- 按栏目切分最直观,出問题时也方便單獨排查
- 如果某個栏目更新极快,可以再按月份切片,避免整份文件频繁變動
- 索引文件和子文件的地址保持同域名,不要跨域引用
lastmod 要真實
lastmod 是最容易被滥用的字段。有人每次生成 sitemap 就把所有頁面的時間刷成目前時間,结果是每天都告诉抓取端全站都更新了,久而久之這個字段就失去了參考價值。更稳妥的做法是让它来自内容本身的實际修改時間,模板調整、样式改版這類不影响正文的改動不要動它。
如果一份 sitemap 里所有頁面的 lastmod 都是同一天,那它提供的更新信号基本等于零。
不该放進去的地址
站点地图是推荐抓取的清單,不是全站地址备份。下面這些放進去只會浪費抓取机會:
- 已经返回 404 或 410 的頁面
- 會 301 跳轉的舊地址,直接放跳轉後的目标地址就行
- 設定了 noindex 的頁面
- 带篩選參數、排序參數产生的重复地址
- 需要登入才能看到内容的頁面
- 站内搜尋结果頁和临时生成的列表頁
前几類属于互相矛盾:一邊告诉抓取端別索引,一邊又把它列進推荐清單,只會让判断變复杂。
生成方式
静態站可以靠构建脚本生成;内容管理系統一般有現成插件,但插件預設配置往往把草稿、附件、标簽全塞進来,需要手動調整范围。手工维護一份纯静態 XML,在几百個頁面以内還能接受,再往上就容易和真實内容脱节。無论哪種方式,關键是把生成這一步接到内容發布流程里,让新頁面出現时自動進文件、頁面下线时自動移除,而不是靠人定期补。
提交之後的监控
把地址寫進 robots.txt 只是起点。之後要看的指标其實很少:文件是否能正常訪問、返回狀態是不是 200、里面的地址是否還是 200、數量有没有異常突增或骤减。數量骤减通常是生成脚本出错,骤增往往是參數地址漏了進来。這些異常在服務器日誌和抓取統計里都能看到,不需要額外的工具。
一個可执行的自查清單
- 直接訪問 sitemap 地址,確認返回 200 且内容是 XML
- 抽查十個里面的地址,確認都是 200 且能正常打開
- 確認文件里没有 404、301、noindex 的地址
- 確認 lastmod 與頁面實际更新時間一致
- 確認索引文件能列出全部子文件,且子文件都能訪問
- 確認 robots.txt 里的 Sitemap 地址拼寫正确、没有多余斜杠
- 在内容發布流程里找到新頁面如何進入 sitemap 這一步,確認它是自動的
這件事本身不复杂,难点在于它容易被忘掉。把它和栏目調整、内容下线放在同一個检查流程里,比單獨记一個待办要可靠得多。