canonical 是建议,不是命令
canonical 标簽的作用,是告诉搜尋引擎:在這一组相似頁面里,哪一個才是我希望它代表主版本。它是一種提示信号,搜尋引擎會參考,但不會無條件照做。很多站点的問题不在于没寫,而在于寫错,或者寫得自相矛盾,最後让本来清晰的頁面關系變得模糊。
可以用一個简單标准判断:如果把這個 canonical 去掉,頁面的規范地址是否依然能被正确识別?如果不能,說明你依赖它太多;如果能,它只是锦上添花。
几種常见的誤用
- 全站指向同一個地址。模板里寫死一條 canonical,導致所有栏目頁、詳情頁都指向首頁或某個列表頁。這等于主動声明這些頁面都是重复内容,是影响最大的一種寫法。
- 指向不可訪問的地址。canonical 指向的頁面返回 404、被 robots.txt 屏蔽,或者又通過 301 跳到別處。信号鏈断掉之後,搜尋引擎只能自己猜。
- 同一頁面出現多條 canonical。一條在 head 里,另一條由组件或脚本注入,两者地址還不一样。這種情况通常會被整体忽略。
- 寫在 body 里,或只在渲染後出現。canonical 應放在 head 区域,並且能在初始 HTML 中直接讀到。如果只有浏览器执行脚本後才出現,部分抓取场景下可能讀不到。
- 分頁全部指向第一頁。列表分頁的每一頁都是獨立可訪問的地址,一般各自自指向即可。全部压到第一頁,會让後續頁面的内容很难被單獨看待。
一份可以照着做的自查清單
- 關閉浏览器 JS,右键查看網頁源代碼,確認 canonical 出現在 head 中,且使用完整地址而非相對路径。
- 統計全站 canonical 的取值分布,看是否存在大量頁面指向同一個 URL 的情况。
- 抽取部分 canonical 指向的地址逐個訪問,確認返回 200,没有被 robots.txt 屏蔽,也没有多余跳轉。
- 確認同一頁面只有一條 canonical,排除模板與组件重复注入。
- 比對 canonical 與實际地址的大小寫、尾部斜杠、http 與 https、是否带 www,這些應與頁面真實地址完全一致。
- 带參數的頁面(排序、篩選、追踪參數)统一指向不带參數的主版本,並確認這個主版本本身可以正常訪問。
- 多語言站点检查 hreflang 與 canonical 是否冲突:通常各語言版本自指向,再由 hreflang 建立彼此關系。
和其他信号保持一致
canonical 不是孤立的。内鏈指向哪個地址、站点地图里提交的是哪個地址、301 重定向最终落到哪個地址,這些最好都指向同一個版本。几個信号各说各话时,搜尋引擎會自己挑一個它更信任的,结果往往不是你想要的那個。改版迁移期間尤其要注意:老地址如果還活着,用 301 轉過去即可,不必再額外加一條指向新地址的 canonical 来加强语气。
观察效果的方式
寫完之後不用天天盯着看。可以在服務器日誌里留意搜尋蜘蛛對同一组頁面的抓取偏好,看它更多抓取的是你指定的規范版本,還是那些重复版本。如果過了一段時間,重复版本仍被频繁抓取,再回头检查上面的清單,問题通常出在某個环节没有對齐,而不是這一條标簽本身没生效。