先分清 canonical 能做什么
canonical 标簽是给搜尋引擎的一個合並提示,不是一條强制指令。搜尋引擎在决定哪一版 URL 進入索引时,會综合内鏈、sitemap、外鏈、内容相似度等信息,canonical 只是其中一項信号。所以“寫了 canonical,收錄的却是另一版”並不算異常,多數情况下是這套信号之間互相打架。
它主要解决的是:同一份内容可以通過多個地址訪問(带參數、大小寫不同、带不带 www、打印版等),你希望哪一版承担權重。
常见的不生效寫法
1. 自引用 canonical 缺失或寫得不一致
每個可索引頁面最好寫一條指向自身的 canonical,並且這個地址要和頁面真實地址完全一致——协议、主机名、路径、末尾斜杠、大小寫都算。如果主版本頁面自己寫了一條指向別處的 canonical,它就會被系統当成副本看待。
2. 指向了一個不可索引的 URL
- 指向的地址返回 301、302 或 404;
- 指向的地址本身带 noindex;
- 指向的地址被 robots.txt 屏蔽。
這几種情况下合並信号基本會被忽略,搜尋引擎只能按自己的判断挑一版。
3. 由脚本注入或位置異常
canonical 放在 head 里最稳妥。如果是脚本動態插入,要確認渲染完成後确實存在,並且不要出現多條互相冲突的 canonical。頁面里出現两個不同的 canonical 地址,等于没寫。
4. 跨域 canonical 需要更多佐證
把 A 站頁面 canonical 到 B 站,處理會比較谨慎。两站内容高度一致、又有互相指向的内鏈时收敛會快一些;否則很可能被直接忽略。
5. 和其他信号自相矛盾
canonical 说 A 是主版本,但 sitemap 里只提交了 B,站内連結也大量指向 B,這就是自己给自己制造矛盾。信号越统一,收敛越快。
一份可执行的自查顺序
- 先确定你真正想保留的主版本 URL,把完整地址记下来,包括协议和末尾斜杠。
- 查看源代碼,確認頁面上 canonical 的實际取值;如果是 JS 頁面,對比渲染前後是否一致。
- 訪問 canonical 指向的地址,確認它返回 200、可以被索引、没有 noindex,也没有被 robots.txt 拦住。
- 检查 sitemap、内鏈、面包屑、结构化資料里的 URL 是否都指向同一個版本。
- 排查參數、大小寫、斜杠造成的多種變体,逐一收敛到主版本。
- 在 Search Console 的 URL 检查里查看 Google 選定的規范網址,和自己的预期做對照。
几個容易忽略的细节
- 分頁不要全部 canonical 到第一頁,那样會抹掉後續頁面的入口價值,一般让每頁自引用更合适。
- 移動版和桌面版互相标注时,canonical 與 alternate 別寫反。
- HTTP 與 HTTPS、带 www 與不带 www,只保留一套,其余用 301 统一。
- canonical 管的是合並,不管發現。指望它加快收錄,方向就错了。
canonical 的作用是把信号摆清楚,而不是替你决定结果。真正進索引的是哪一版,仍取决于這套信号加上抓取和内容判断的综合结果。
調整之後不建议频繁改動,给系統一点重新评估的時間,再回看選定規范網址是否已经收敛。如果長期不一致,優先检查第 2、3 步,多數問题出在 canonical 指向的地址本身不可索引。