canonical 是一個很小的标簽,寫在 head 里,平时几乎没人注意。可它一旦寫错,影响是全站性的:搜尋引擎會按你标注的地址去归並信号,如果标错了,真實内容可能被当成副本,错的地址反而被当成正主。更麻烦的是,這類問题不會报错,頁面照常打開,只有主動比對才會發現。
先弄清楚 canonical 想解决什么
同一個内容常常有多個可訪問地址:带篩選參數、带大小寫差异、带尾斜杠、分頁、打印版、移動版。canonical 的作用是告诉抓取方:這几條地址里,哪一條是我認可的正式版本。它不是重定向,不會让用戶跳轉,也不保證一定被采纳,只是一條建议性的信号。
理解這一点很重要。很多人把 canonical 当成萬能胶,哪里觉得重复就贴哪里,结果反而制造出新的矛盾。
常见的几種寫歪方式
- 全站统一指向首頁:模板里寫死一個固定地址,導致所有文章頁都声明首頁是正主。這等于主動放弃自己的頁面,是最嚴重的一類。
- 分頁頁全部指向第一頁:列表第 2、3 頁與第一頁内容並不相同,却声明第一頁為正式版本,後續頁面容易失去被發現的机會。
- 目标地址本身不可用:canonical 指向的地址返回 404、5xx,或者落在一條很長的跳轉鏈上,信号無處落地。
- 多語言版本混指:不同語言頁面互相 canonical 到同一個地址,和 hreflang 的表述互相打架。
- 參數頁缺少自指:篩選、排序、會话參數生成的地址既没有自指,也没有指向干净版本,重复内容就這么堆积起来。
- 一個頁面出現多條 canonical:模板拼接或组件重复輸出,head 里出現两條以上,抓取方只能自己挑一條,结果不可控。
自查可以按這個顺序做
- 取一批代表性地址:首頁、栏目頁、文章頁、分頁頁、參數頁、多語言頁,每類挑几條,不要只看首頁。
- 把這些頁面的 canonical 值導出成一張表,和頁面自身的 URL 放在同一行對比,视觉上一眼能看出是否自指。
- 逐條判断是否同时满足三点:自指、指向同類内容、指向一個可正常訪問的地址。
- 沿着 canonical 目标再訪問一次,確認它不跳轉、不 404、不返回 5xx,也不是另一個 canonical 的中間站。
- 單獨检查分頁與多語言:分頁按既定策略自指或指向干净列表,多語言自指,跨語言關系交给 hreflang 表達。
- 把结果记錄進表格並标明日期,模板改動後重新跑一遍,避免舊结论一直沿用。
和別的信号保持一致
canonical 不是孤立存在的。它要和你提交的 Sitemap、站内連結、跳轉規則说同一件事。如果 Sitemap 里寫的是 A 地址,頁面 canonical 指向 B,内鏈又大量指向 C,三種信号互相拆台,抓取方只能自己猜。更省事的做法是:先把哪個地址是正式版本定下来,再让這几處全部對齐,改一處就顺带检查其余几處。
發現異常时的排查次序
先看模板輸出是否被错誤复用,再看 head 里是否出現重复标簽,然後確認目标地址的狀態碼和跳轉层數,最後才去怀疑抓取方的判断。多數問题出在模板,而不是抓取策略。
別把它当成一次性工作
模板一改、频道一加、參數規則一調,canonical 的輸出就可能跟着變。建议把它放進發布检查清單里,尤其是涉及列表頁和詳情頁模板的改動。平时也可以定期抽样,看新發布的頁面是否還带着正确的自指。
提示:canonical 是建议而不是命令。與其指望它兜底,不如從源头减少同一内容的可訪問地址數量,把重复地址控制在少量范围内,剩下的再交给它收口。