canonical(規范連結)本质上是頁面里一個普通的 link 标簽,作用是告诉搜尋引擎:這一组相似地址里,我建议你把哪一個当成主版本。它是提示信号,不是重定向,也不是指令。寫對了可以减少重复,寫错了却可能让本来能被索引的 URL 登出索引,或者让主版本迟迟不被替換。
一、canonical 指向的几種典型错誤
1. 指向會跳轉的 URL
常见场景是:A 地址已经 301 到 B,但 B 頁面的 canonical 仍然寫着 A。爬虫顺着這條线走過去,先遇到一次跳轉,又回到目前頁面,規范信号被绕了一圈,等于没有表態。寫法上應当直接指向最终可達、返回 200 的那個地址。
2. 指向被屏蔽或 noindex 的 URL
canonical 指向的頁面被 robots.txt 拦掉、带 noindex,或者需要登入才能打開。這類目标對搜尋引擎不可见,主版本就無法被確認。结果可能是 canonical 被忽略,也可能是两個地址都停留在不确定狀態。規范目标本身應该是可被抓取、可被索引的。
3. 鏈式與互指
A 指 B、B 指 C、C 又指回 A,是模板拼接或改版遗留造成的。每多一跳,信号就多一次稀释。互指更隐蔽:A 指 B、B 指 A,两邊看着都像主版本,實际谁也不算。一组相似頁面里,最好只有一個地址承担主版本角色。
4. 指向 404、410 或不存在的地址
多出現在域名迁移、目錄調整之後:只改了頁面模板,没同步改 canonical,于是整站頁面都在向一個死鏈表達規范關系。這種寫法不但不起作用,還會让後續排查绕遠路。
5. 分頁與篩選頁统一指向第一頁
把第 2 到第 N 頁的 canonical 全部指回第 1 頁,會让後續分頁上的條目失去獨立入口。如果這些條目本身有各自的 URL,優先保證條目地址能被發現和抓取,而不是把整组分頁压成一個地址。取舍要看這些分頁是否承载了獨立内容。
6. 跨域指向内容並不相同的頁面
跨域 canonical 成立的前提是两邊内容高度一致。若只是主题相近、正文不同,硬指過去並不能解决重复問题,反而可能让两邊的收錄判断都變模糊。
二、自查方法
- 抽样抓取:随机取几十個不同模板的頁面,看 HTML 里的 canonical 是否與浏览器最终地址一致,重点核對协议、www、目錄和尾斜杠。
- 單獨訪問一次:把 canonical 里的目标地址複製出来單獨打開,確認返回 200 且没有被 robots 規則挡住。
- 對照站点地图:sitemap 里提交的 URL,應與頁面 canonical 指向的 URL 保持一致,两套口径不一致时先统一。
- 看索引狀態變化:被 canonical 排除的 URL 數量是收敛還是異常增長,判断属于预期收口還是配置寫错。
三、修复顺序
- 先修指向死鏈、重定向和被屏蔽地址的 canonical,這類寫法完全没有正向作用。
- 再解開鏈式與互指,让一组頁面只保留一個主版本。
- 然後统一寫法,並让内鏈、站点地图、canonical 三者指向同一個地址。
- 最後观察索引狀態,改動需要等頁面被重新抓取後才可能体現,不會即时生效。
canonical 是建议,不是命令。它的作用建立在一個前提上:這些頁面的内容确實高度相似。
如果两個頁面的正文差別明顯,與其硬指 canonical,不如考虑合並内容、做重定向,或者干脆保留為两個獨立頁面。canonical 能處理的是同一份内容出現在多個地址,處理不了两份不同的内容。改動之後,先看抓取日誌里這些 URL 的訪問频率有没有變化,再判断後續的索引狀態,比盯着某一天的收錄數字更可靠。