蜘蛛池里入口頁的數量通常遠多于目标頁,同一份模板換几個路径、带几個參數,就可能變成十几個能訪問的地址。對搜尋引擎来说,這些地址内容几乎一样,必须先决定拿哪一個当代表,否則抓取预算會被摊薄。canonical 标簽就是表達這個偏好的手段之一,但它只在特定场景下合适,用错了反而增加麻烦。
入口頁為什么容易出現重复内容
重复往往不是刻意造成的,而是技術和歷史原因叠加的结果。常见来源包括:
- URL 大小寫、结尾斜杠、index.html 等寫法不统一;
- 跟踪參數、排序參數、會话 ID 产生的多個變体;
- 分頁列表的每一頁、打印版、移動版各自可訪問;
- http 與 https、带 www 與不带 www、多個域名解析到同一台服務器。
這些地址在蜘蛛眼里都是獨立 URL,抓一個就往预算里记一筆。入口頁铺得越多,重复抓取的损耗越明顯。
canonical 能做什么、不能做什么
canonical 表達的是“我認為代表地址是它”,本质是建议而不是强制指令。搜尋引擎可以采纳,也可以忽略。它不會阻止蜘蛛訪問目前頁面,也不等于把頁面從索引里移除。
更需要留意的是,如果 canonical 指向的地址本身返回 404、被 robots 屏蔽,或者和頁面上的其他規范信号互相矛盾,這條建议大概率不會生效,甚至會让蜘蛛反复在两個地址之間来回確認,反而多花一次抓取。
什么时候该用 canonical
- 内容确實相同,但地址無法统一,比如參數由系統生成,改不動;
- 分頁第一頁存在多種入口寫法,希望把信号集中到主地址;
- 多個域名解析到同一站点,需要指定其中一個作為代表。
如果地址可以彻底合並,優先用 301 跳轉。301 是执行层面的明确處理,比 canonical 更干净,也省掉蜘蛛两次抓取的成本。canonical 更像是留给“動不了 URL”的场景做补救。
和 noindex、301 的分工
這三者目标不同:301 是搬家,noindex 是請出索引,canonical 是選代表。如果某些入口頁本来就不打算被收錄,用 robots 或 noindex 處理更直接;如果只是想让權重和抓取集中,canonical 或 301 更合适。把 noindex 和 canonical 同时用在一個頁面上,容易让信号互相抵消,蜘蛛可能既不敢收錄目前頁,也不确定目标頁是否该收錄。
寫法上的常见問题
- 尽量使用完整绝對地址,减少解析歧义;
- 避免 canonical 鏈,A 指向 B、B 又指向 C,蜘蛛要多次跳轉才能定下结果;
- 不要指向 404、會跳轉的地址或已经下线的入口頁;
- 不要把所有入口頁都指向首頁,那属于掩盖重复,不是解决重复;
- 跨域 canonical 要谨慎,代表頁必须真的可訪問、内容一致。
怎么驗證有没有生效
源碼里寫上不算完成,還要看實际表現:
- 從訪問日誌確認蜘蛛是否抓取了目前頁面,之後是否去抓 canonical 目标地址;
- 检查同一内容的多個地址,看索引里最终保留的是哪一個;
- 观察入口頁的被抓次數是否下降,如果仍在被反复抓取,說明規范信号没被采纳;
- 改動後不要频繁反复調整,给蜘蛛留出重新確認的時間。
一点建议
把 canonical 当成入口頁整理的一部分,而不是孤立的一項操作。先盘点哪些地址是真正重复的,再决定能 301 的就 301、该 canonical 的寫 canonical、该屏蔽的屏蔽。顺序理清了,抓取预算才不會被無意义的重复地址吃掉。