canonical 标簽的作用是告诉搜尋引擎“這一组内容相近的頁面里,我認為哪個是主版本”。注意是“我認為”——它属于提示(hint),不是必须执行的指令。搜尋引擎會结合頁面内容、内鏈、外鏈、站点地图等信息综合判断。所以出現“寫了 canonical 但收錄结果和预期不一致”是常见現象,不一定是寫错了。
canonical 在做什么,不做什么
它主要影响两件事:一是多個 URL 内容相同时,信号往哪個 URL 集中;二是在搜尋结果里優先展示哪個 URL。它不负责阻止抓取(那是 robots.txt 的事),也不负责阻止進入索引(那是 noindex 的事)。把這三件事混在一起用,是很多收錄問题的起点。
几種常见的“指向不對”
1. 指向一個不存在或打不開的 URL
canonical 寫成了草稿地址、舊路径或拼错的路径,且该地址返回 404 或 5xx。這種情况下,搜尋引擎通常不會把信号交出去,而是回到自行判断,收錄可能仍停留在原 URL,也可能两個 URL 都不稳定。
2. 全站都指向首頁
模板里寫死了首頁 canonical,導致所有内頁都声明“主版本是首頁”。這會让内容頁彼此难以区分,比較常见的结果是内頁收錄數量變少,收錄集中在少數几個 URL 上。
3. 分頁、篩選頁互相 canonical
把第 2 頁、篩選结果頁都 canonical 到第 1 頁,本意是收敛變体。但如果這些頁面上有獨立可索引的内容,全部收敛可能让它們失去被單獨收錄的机會。要不要收敛,取决于這些頁面是否有獨立的搜尋需求。
4. 同一頁面在两個域名或协议上互指
測試域名、CDN 域名、http 與 https 各自都寫了指向自己的 canonical,等于没有收敛。需要確認主域名唯一,並让其他變体一致指向主域名。
收錄會落在哪個 URL 上
寫了 canonical 之後,比較常见的几種结果:
- 按预期收敛:只有主版本 URL 出現在索引里,變体逐步登出。
- 两個 URL 都在索引里:搜尋引擎認為两者内容差异足够大,或對 canonical 的信任不足。
- 收錄的是被指向的 URL,但内容来自原頁面:出現過“收錄 A 的地址、展示 B 的内容”這類情况,通常是信号冲突導致。
- 原 URL 仍在索引里,只是展示时替換成主版本:這属于展示层的處理,不代表索引里已经換人。
這些结果之間没有绝對的先後顺序,也没有固定的生效時間,只能通過观察搜尋端的表現来確認。
自查顺序
- 確認 canonical 里的 URL 能正常打開,返回 200,且不是重定向鏈的中間地址。
- 使用不带參數、不带跟踪碼的規范地址,绝對路径優于相對路径。
- 核對頁面自身是否被 noindex、被 robots.txt 屏蔽,或需要登入才能訪問——這些都會让 canonical 失去意义。
- 检查是否輸出了多個 canonical,或者 JS 注入的 canonical 與源碼里的不一致。
- 看内鏈和站点地图指向的是哪個 URL。如果這两處和 canonical 说的不一致,先统一。
- 观察目标 URL 是否已被收錄、是否有抓取记錄,再去判断 canonical 是否生效。
几條可以减少麻烦的习惯
- 一個頁面只保留一個 canonical,別让模板和手動配置同时輸出。
- canonical 指向的 URL 應当是可抓取、可索引的真實内容頁,不要指向列表頁或搜尋頁。
- 同一批内容只保留一套主 URL,參數、大小寫、末尾斜杠的處理尽量在服務器层统一。
- 改版換 URL 时,canonical、内鏈、站点地图、301 尽量同步更新,不要只改一處。
canonical 解决的是“同一份内容该算在谁头上”,不是收錄開關。遇到收錄不符合预期时,先確認頁面能不能被抓、能不能被索引,再回头看 canonical 是否自洽。