canonical 标簽的作用是告诉搜尋引擎:這一组地址里,哪個是主要版本。它不强制,也不保證一定被采纳,但它能减少同一篇内容出現多個候選地址的情况。很多站点上线时寫了一次,之後改版、加參數、換域名都没有再回头看,問题就留在頁面里了。
先弄清楚 canonical 想解决什么
同一個頁面往往可以通過多個 URL 訪問:带 www 和不带 www、HTTP 和 HTTPS、带跟踪參數、列表頁翻頁、打印版、排序參數等。如果這些地址都能打開相同或高度相似的内容,抓取资源就會被分散,外鏈和權重信号也可能被拆開。canonical 就是用来收敛這些信号的。
但要注意,canonical 不是重定向。它不會阻止用戶或蜘蛛訪問原地址,只是表達一個偏好。所以不要把它当成屏蔽重复頁面的唯一手段。
常见的几類错誤
自引用缺失或寫错
每個正常頁面最好都带上指向自己的 canonical。如果模板漏掉了,或者變量取错,可能出現 A 頁面 canonical 指向 B、B 又指向 C 的鏈式情况。建议随机抽一批 URL,直接查看源代碼里的 canonical,確認它和目前地址一致。
參數頁和篩選頁指向不统一
带排序、篩選、分頁參數的地址,canonical 應该指向不带參數的主版本,還是保留自引用,取决于這些頁面是否有獨立價值。没有獨立内容的篩選结果,通常指向主列表;有獨立搜尋意图的,可以保留自引用並把内容做扎實。最怕的是同一類頁面一半指向主版本、一半自引用,信号互相矛盾。
分頁與 canonical 打架
分頁的第二頁、第三頁,不應该全部 canonical 到第一頁。如果每頁都有獨立 URL 且内容不同,保留自引用更合适。把分頁全部指回第一頁,容易让後續頁面的内容失去被發現的机會。真正需要收敛的是那些内容重复、僅參數不同的翻頁地址。
协议和域名版本没统一
網站從 HTTP 切到 HTTPS,或者從非 www 切到 www 之後,canonical 如果没有同步更新,就會出現 HTTPS 頁面的 canonical 指向 HTTP 地址的情况。這會让抓取信号绕遠路。自查时可以搜尋源碼,確認 canonical 里用的是最终上线的协议和域名,而不是舊版本。
和 hreflang 互相干扰
多語言站点里,canonical 和 hreflang 要配合。每種語言版本通常 canonical 指向自己,hreflang 再互相指向。如果所有語言版本的 canonical 都指向英文站,其他語言版本就很难被当成獨立頁面處理。改之前先確認語言目錄和 hreflang 的對應關系。
一份可执行的自查清單
- 從 sitemap 或日誌里抽 30 到 50 個有代表性的 URL,覆盖首頁、栏目頁、詳情頁、分頁、參數頁。
- 逐個查看源代碼中的 canonical,记錄它指向的地址。
- 检查 canonical 目标是否返回 200、是否是最终版本,避免指向 301、404 或已下线頁面。
- 對比同一内容的不同入口,確認它們是否指向同一個主版本。
- 如果頁面是前端渲染,检查渲染完成後的 DOM 里 canonical 是什么,別只看初始 HTML。
- 改完之後保留一份记錄,過一段時間再看日誌和索引狀態是否收敛。
修改时別踩這些坑
- 不要把不同主题的頁面互相 canonical,這比缺失更麻烦。
- 不要為了让某個頁面“更快被收錄”而乱指向,canonical 不是加速工具。
- 不要一次性全站改掉,先小范围測試,確認模板和變量輸出正确。
- 如果頁面已经通過 301 合並,记得同步检查 canonical,避免两套規則互相矛盾。
canonical 的價值在于表達偏好,而不是替你做决定。頁面本身是否重复、是否有獨立價值,仍然要先判断清楚。
canonical 标簽不需要每天盯着,但它值得在改版、換域名、加篩選功能之後重新過一遍。把它和 sitemap、robots.txt、重定向規則放在同一張检查表里,站点的地址信号會清楚很多。