站点地图(Sitemap)和頁面 canonical 都在向搜尋蜘蛛表達同一件事:這個地址值得抓取、應当被当作正式入口。但两者並不總是同步维護,改版、分頁、參數化調整之後,经常出現 Sitemap 里寫 A 地址、頁面 canonical 指向 B 地址的情况。蜘蛛拿到两份互相矛盾的信号,通常會選一個繼續抓,另一個逐渐减少訪問。這個過程不會报错,只會表現為某些入口慢慢没人来。
先判断信号是不是真的冲突
並不是所有不一致都算問题,需要先区分三類情况。
- 等價不一致:只差结尾斜杠、大小寫、http 與 https、www 前缀。這類属于規范化层面,會带来重复入口,但可以通過统一跳轉解决。
- 归属不一致:Sitemap 寫的是列表頁,canonical 指向詳情頁或聚合頁,两者内容並不相同。這類属于入口归属判断错誤。
- 過期不一致:頁面已经下线或改版,Sitemap 仍是舊地址,canonical 已经換成新地址。這類是维護滞後。
把這三類分開,後面的處理方式差別很大,先统一归類再動手。
核對顺序:從声明到落地
- 抽样子集:從 Sitemap 里按栏目各抽 20 到 50 條,不必全量,覆盖主要目錄即可。
- 取頁面 canonical:抓取頁面源碼,记錄 canonical 的 href 值,注意区分 head 里的声明和响應头里的 Link 声明。
- 比對是否自洽:Sitemap 地址與 canonical 地址去掉协议、域名、结尾斜杠後是否一致,不一致就進入下一步。
- 看服務器日誌落地:在訪問日誌中篩選蜘蛛 UA,看它實际請求的是哪個地址、返回什么狀態碼、是否發生跳轉。
- 看跳轉鏈:如果 Sitemap 地址會 301 到 canonical 地址,說明两處声明其實一致,只是入口绕了一步;如果两者各自返回 200,就是真正的一頁两入口。
- 確認收錄归属:在搜尋後台查看這两個地址的收錄與展示情况,判断搜尋引擎最终選擇了哪一個。
常见成因
- 改版後栏目路径變化,Sitemap 生成脚本沿用舊規則,頁面模板已经更新。
- 分頁與篩選參數頁被寫進 Sitemap,而頁面自身 canonical 指向第一頁。
- 多域名或多語言站点,語言選擇逻辑與 Sitemap 域名配置不统一。
- 内容聚合頁與原始詳情頁互相 canonical,形成 A 指 B、B 指 A 的循环。
- Sitemap 由第三方工具生成,與站内模板维護在不同节奏上。
處理原則
優先让两處声明指向同一個地址
大多數情况下,正确做法是修改 Sitemap,让它輸出與 canonical 一致的地址,而不是反過来改 canonical 去迁就 Sitemap。canonical 是頁面級別的判断,更贴近内容本身;Sitemap 是站点級別的清單,改起来成本更低。
能跳轉就不要两處並存
如果舊地址确實需要保留對外可见,用 301 指向正式地址即可。Sitemap 里只保留最终地址,避免把跳轉前的地址繼續提交。
發現循环 canonical 先断鏈
A 指 B、B 指 A 會让蜘蛛無法确定归属,通常结果是两個地址的抓取频率都下降。保留一個作為自指向,另一個改為 301 或直接下线。
核對时以日誌為准,不要只看頁面源碼。源碼可能被缓存或由前端渲染,日誌里的請求记錄才是蜘蛛實际走過的路径。
核對完成後要留下记錄
建议把這三項记在同一份表里:Sitemap 地址、canonical 地址、日誌中實际抓取地址與狀態碼。下次改版或調整脚本时可以對照,避免同一類偏差反复出現。入口數量變少不等于流量一定下降,關键看保留下来的是不是頁面真正應该被訪問的那個地址。