canonical 标簽常被当成一個「收錄開關」来用,以為加上它頁面就一定會被收錄,或者去掉它頁面就會消失。實际上它更接近一個提示:在一组内容相同或高度相似的 URL 里,你希望搜尋引擎把哪一個当作首選版本。理解這一点,很多誤用就能自己判断出来。
canonical 處理的是「選哪個 URL」,不是「收不收錄」
搜尋引擎在遇到多個地址指向近似内容时,需要挑一個進入索引,其余的被合並過去。canonical 是你表達偏好的方式之一,但它只是众多信号中的一個,權重不如 301 重定向明确,也不如頁面本身的内部連結和外部連結有说服力。如果頁面本身质量低、内容薄,或者長期抓取失敗,即使 canonical 寫得很标准,也不代表它會被收錄。
反過来,如果一個頁面既没有 canonical,也没有其他重复版本,它並不需要靠 canonical 来「争取」收錄。
常见的寫法错誤
- 指向會跳轉的 URL。canonical 指向一個 301 目标地址,等于把首選版本声明成了一條中轉路径,爬虫需要多走一步才能確認,容易造成信号混乱。首選版本應当是最终可訪問的那個地址。
- 指向被 noindex 的頁面。一邊告诉搜尋引擎「這是首選版本」,一邊告诉它「不要索引這個頁面」,两個信号直接冲突,结果往往是谁都不進索引。
- 全站统一指向首頁。把列表頁、詳情頁、专题頁的 canonical 全部寫成首頁,會让爬虫認為這些頁面都是首頁的副本,它們的收錄價值被主動放弃。
- 分頁頁面全部指向第一頁。如果第 2、3 頁有獨立價值,全部指回第一頁會让後續頁碼失去進入索引的机會。是否收敛要看這些頁碼是否真的只是導航。
- 多語言或多地区頁面互相 canonical。不同語言、不同地区的頁面面向不同用戶,應当用 hreflang 建立對應關系,而不是互相声明成重复内容。
- 用相對路径、带追踪參數或 http/https 混寫。這些寫法不一定出错,但會增加解析成本,也容易在改版後失效。寫成完整的绝對地址更稳妥。
它和 301、noindex、sitemap 的關系
如果两個地址是同一個頁面,比如 http 與 https,或者带 www 與不带 www,優先用 301 重定向,這比 canonical 明确得多。canonical 更适合「内容相同但無法做重定向」的情况,例如同一個商品被多個分類路径引用。
noindex 是要求頁面登出索引,canonical 是声明首選版本,两者不要同时指向同一個頁面。sitemap 里如果只提交了首選版本,和 canonical 保持一致即可;如果两個版本都提交,反而會让信号互相抵消。
判断标准很简單:你希望用戶最终停在哪個地址上,canonical 就指向那個地址,並保證它自己能正常打開、不被 noindex、不跳轉。
排查首選版本冲突的顺序
- 確認頁面上是否同时存在多個 canonical 标簽,只保留一個。
- 確認 canonical 指向的地址能直接訪問,返回 200,且不经過重定向。
- 確認该地址没有被 robots.txt 屏蔽,也没有 noindex。
- 核對 sitemap 與内部連結中使用的地址,是否和 canonical 一致。
- 观察一段時間内抓取日誌,看爬虫是否真的在抓取你声明的首選版本。
什么时候可以不寫 canonical
如果頁面只有唯一地址,没有參數變体、没有多路径引用、没有新舊版本並存,那么不寫 canonical 通常没有影响。真正需要處理的是那些确實存在多個地址、又無法靠重定向合並的场景。把這些场景列清楚,比全站机械式地加一段 canonical 更有用。