canonical 是頁面自己声明“哪個 URL 才是我希望被收錄的版本”。它是一條建议,不是命令。很多站点把 canonical 当成重定向来用,结果就出現“声明指向 A,索引里却是 B”的情况。下面按声明、自選、冲突三個层面,把常见情形和排查方法理一遍。
canonical 能做什么,不能做什么
- 能表達偏好:告诉搜尋引擎多個相似 URL 里你更希望哪一個被索引。
- 不是重定向:用戶和爬虫仍然會訪問原 URL,你只是希望索引归到另一個地址。
- 不是 noindex:它不阻止抓取,也不保證某個 URL 從索引里消失。
- 不等于必然生效:搜尋引擎會结合内鏈、站点地图、内容相似度自己判断,與声明冲突时可能直接忽略。
最容易寫错的几處
指向一個本身不能被收錄的地址
例如 canonical 指向的頁面被 noindex、返回 404 或 410,或者被 robots.txt 挡住。這種情况下声明基本無法执行,搜尋引擎會自己挑一個版本。
目标頁自己也 canonical 到別處
A 指向 B,B 又指向 C,或者 B 指回 A 形成环。鏈條越長越绕,越容易被判定為不可信。
分頁、篩選、排序參數互相指
列表頁第 2、3 頁都 canonical 到第 1 頁,可能连带把後續頁上獨有的内容一起忽略。带篩選參數的頁面如果不是同一批内容,硬指到無參數版本,往往是白指。
模板複製後忘了改
批量生成頁面时,canonical 里寫死了某個固定 URL,或者相對路径拼接出错,最後全站都指向首頁。抓几個 URL 的源碼就能發現這類問题。
冲突时怎么排查
- 抓取原頁面的 HTML,先看服務端返回的内容,確認 canonical 的實际值,注意协议、域名、结尾斜杠是否與你以為的一致。
- 訪問目标 URL,確認它返回 200,没有被 robots.txt 挡住,也没有 noindex。
- 看目标頁自己的 canonical 指向哪,避免出現环或断点。
- 在索引資料或搜尋结果中,看實际被選中的是哪一個版本。
- 把内鏈、站点地图、canonical 三處统一指向同一個首選 URL,信号一致比單点声明更有用。
什么时候不该用 canonical
如果两個頁面的主体内容确實不同,比如不同商品、不同城市的服務頁,硬把它們指到同一個 URL,不會帮你集中權重,反而可能让其中一個長期進不了索引。canonical 适合處理同一份内容的不同 URL 版本,不适合用来合並内容不同的頁面。
改完之後怎么观察
調整不會立刻反映在索引里,通常要等下一轮抓取。可以观察抓取日誌里首選 URL 的訪問是否增加、原 URL 的出現是否减少,以及索引中保留的版本是否與预期一致。如果几周後還是相反,優先回头检查上面那几處冲突,而不是反复修改声明。
把 canonical 当成一種一致的表達,而不是開關。它起作用的前提是,你的内鏈、站点地图和其他信号说的是同一件事。