canonical 是頁面里一行不太起眼的声明,很多模板自動生成之後就再没人看過。它决定了搜尋引擎更愿意把哪個地址当作這批相似内容的代表。寫對的时候它安静地工作;寫错的时候通常不會报错,也不會有任何提示,只是让同一批内容在结果里互相消耗。
它到底在解决什么問题
同一個頁面经常有多個可訪問的地址:带 www 和不带 www、http 和 https、带尾斜杠和不带、列表頁的翻頁、带追踪參數的分享連結。這些地址返回的内容基本一致,如果没有明确說明,搜尋引擎需要自己判断哪個是主版本。canonical 的作用就是把這一次判断變成明确的声明。
但要注意,它是建议而不是指令。搜尋引擎仍然會结合内鏈、站点地图、重定向等信号综合判断,所以 canonical 應当與這些信号保持一致,而不是互相打架。一邊在 canonical 里声明 A,一邊把所有内鏈都指向 B,效果往往适得其反。
常见的几類問题
指向了不存在或會跳轉的地址
這是最常见的一種。canonical 寫的是 A,但 A 本身 301 到 B,或者 A 早已 404。這種情况下声明基本失效。正确的做法是让它直接指向最终可訪問的規范地址,中間不要再经過跳轉。
全站套用同一個模板值
有些模板把 canonical 寫成了固定的首頁地址,结果所有文章都声明自己的正主是首頁。這等于让栏目頁和詳情頁主動登出。canonical 應当按頁面自身地址動態生成,而不是套一個寫死的字符串。
分頁與篩選頁處理不当
列表第二頁的 canonical 如果指回第一頁,等于告诉搜尋引擎第二頁的内容不必單獨存在。分頁頁面更适合使用自指 canonical,或者保留可抓取的獨立地址,具体取决于你是否希望它們被單獨發現。
跨域声明用得太随意
把内容同步到另一個域名时,用 canonical 做過渡是可以的,但長期两只脚站两個域名容易产生混乱。迁移场景更稳妥的方式仍然是 301 加上頁面内鏈的同步更新。
一份可以照着做的自查清單
- 随机抽取各栏目頁、詳情頁、列表頁,查看頁面源碼中的 canonical 值。
- 確認该地址能直接打開,返回 200,且不發生跳轉。
- 確認它與頁面自身地址一致,除非确實存在另一個主版本。
- 检查是否被誤寫為首頁、栏目頁等不相關地址。
- 检查协议與域名寫法是否和站点地图、内鏈、重定向保持统一。
- 用带參數的分享連結打開頁面,看 canonical 是否回到干净地址。
- 對比站点地图中的地址與 canonical 声明是否一致。
- 观察服務器日誌里規范地址與重复地址的抓取比例變化。
修改时的几点提醒
調整 canonical 属于影响面較大的改動,不建议一次性全站替換。可以按栏目分批進行,改完後观察一段時間的日誌和索引表現,再决定是否扩大范围。
canonical 不能替代重定向。已经确定不再使用的舊地址,仍然應该用 301 處理;canonical 更适合處理两個地址都想保留、但只希望一個被展示的情况。
也不要指望加上 canonical 就立刻见效。它只是把意图表達清楚,最终判断仍由搜尋引擎完成,和其他结构性因素一起起作用。
一句话:canonical 的作用是减少歧义,而不是制造新的矛盾。它寫的那個地址,應该就是你自己也愿意分享出去的那一個。