站点地图(sitemap)的作用很朴素:把站点里希望被發現的 URL 集中列一份,交给搜尋引擎讀取。它不保證收錄,但能减少「頁面存在却没被找到」的情况。麻烦在于,很多站点的 sitemap 是上线时生成一次,之後随着栏目調整、文章下线、域名迁移慢慢失真,最後成了一份指向大量失效地址的清單。
為什么這份文件容易失真
内容在變,sitemap 却常常没跟着變。文章删了、栏目合並了、URL 規則改了,文件里還留着舊地址;反過来,新上线的頁面又没被加進去。如果 sitemap 是手工维護的静態文件,這個問题會更明顯。它本身不會报错,只是安静地给出越来越不准确的信号。
常见的几類問题
- 指向 404 或已刪除内容的 URL,讀取方反复撞空。
- 列的是跳轉前的舊地址,而不是最终可訪問地址。
- 混入被 robots.txt 屏蔽、或頁面带 noindex 的地址,信号自相矛盾。
- 站内搜尋结果頁、排序篩選參數頁、過深的分頁,數量遠超過真實内容頁。
- 同一篇内容出現 http 與 https、带 www 與不带 www 等多個版本。
- 标簽、作者、日期归档等自動生成的大量近似頁面,内容單薄。
文件层面的限制
單個 sitemap 文件通常建议不超過 5 萬條 URL,未压缩体积不超過 50MB,超出就應拆分成多個文件,再用 sitemap 索引文件匯總。索引文件本身也有數量和体积上限。有些站点的問题不在内容,而在于一個文件塞了几十萬條,讀取端只能處理其中一部分,剩下的等于没交出去。
自查清單
- 抽样訪問:從文件里随机抽 20 到 50 條,逐條打開,確認返回正常狀態碼且内容對得上。
- 狀態碼核對:批量检查是否含 404、5xx 以及需要跳轉的地址。
- 地址一致性:sitemap 里的地址與頁面 canonical 指向是否一致。
- 屏蔽項比對:確認清單中不含 robots.txt 禁止抓取的路径。
- 低價值 URL 過滤:搜尋頁、排序參數、會话 ID、重复篩選组合尽量排除。
- 數量與分片:检查單文件條目數與体积,索引文件是否正确引用各個子文件。
- 更新時間:lastmod 是否真實反映内容修改時間,不要每次生成都全量刷新。
- 可訪問性:文件地址能否直接打開,robots.txt 里是否声明了它的位置。
生成與更新的两種做法
静態生成
内容量不大时,可以定期跑一次脚本生成,放到固定路径。好處是可控,坏處是需要有人负责触發,容易忘记。可以把它挂進發布流程,或者用定时任務每天跑一次。
動態輸出
内容量大、更新频繁时,通常由程序實时輸出。這類實現要重点確認两件事:一是排除逻辑是否生效,二是輸出内容是否與线上真實地址完全一致,避免測試环境地址混入。
不必追求 sitemap 覆盖所有頁面。它更适合承载结构清晰、值得被發現的地址;把一堆參數頁塞進去,反而稀释了真正内容的信号。
把 sitemap 检查放進改版、栏目調整、批量下线的流程里,每次结构調整後過一遍,比事後從日誌里倒查要省事得多。