同一篇内容,在浏览器里可能有四五個都能打開、内容也基本一致的地址:带 www 和不带 www、http 和 https、结尾有没有斜杠、URL 里带没带一串跟踪參數。對用戶来说差別不大,對搜尋引擎来说却是几個不同入口。canonical 就是用来在這種情况下指明首選版本的工具,但它经常被寫错,或者寫了却没和内鏈、站点地图對齐。
重复 URL 通常從哪来
- 协议與主机名:http 與 https、www 與裸域名同时可訪問,且没有做跳轉收敛。
- 寫法差异:大小寫混用、结尾斜杠有無、index.html 與目錄地址並存。
- 參數:来源跟踪參數、排序與篩選參數、分頁參數、會话 ID。
- 功能頁:打印版、分享版、移動版、AMP 版各自有獨立地址。
- 环境残留:測試域名、舊域名、镜像站点仍然可以打開。
這些地址大多来自模板生成或者歷史遗留,不會自己消失。站長需要知道哪些是真實存在的重复,而不是凭感觉猜。
canonical 的常见寫法错誤
canonical 是一個提示信号,不是强制指令。寫错时不僅没有收敛作用,還可能让抓取方向更混乱。以下情况在巡检中很常见:
- 整站指向首頁:模板里寫死了一個固定地址,導致所有頁面都声明首頁是首選版本。
- 指向不可用地址:目标返回 404、500,或者指向重定向鏈中間的某一跳。
- 與頁面内容不一致:A 頁面声明 B 是首選,但两個頁面的主体内容其實不同,属于强行合並。
- 带參自指:頁面本身是干净地址,canonical 却輸出了带跟踪參數的版本。
- 相對路径拼接出错:目錄层級處理不当,輸出成不存在的路径。
- 分頁處理粗糙:列表翻頁的每一頁都被声明成第一頁,或者反過来每一頁都自指却没有区分内容。
可以照着做的一轮巡检
- 從站点地图、栏目頁、内鏈中抽取一批代表性 URL,覆盖首頁、栏目頁、詳情頁、列表翻頁、带參地址。
- 记錄每個地址的返回狀態、最终落地地址、頁面标题與 canonical 輸出值,重点看四者是否自相一致。
- 翻一段時間的服務器訪問日誌,看搜尋蜘蛛實际抓取了哪些带參地址和重复地址,這比猜测更接近事實。
- 把内鏈、導航、站点地图里的寫法统一成 canonical 所声明的版本,减少自己制造重复入口。
- 把已经确定的重复入口用 301 收敛,而不是只靠 canonical 声明。
- 確認模板不會因為參數、語言、终端差异而輸出不同的 canonical 值。
什么情况用 301,什么情况用 canonical
如果一個地址确定不再使用,優先做 301,让訪問和權重都稳定落到新地址。canonical 更适合那些無法直接重定向的场景,例如同一地址因參數不同而生成的多種组合、多域名並存期間的過渡、以及功能頁與正文頁的關系說明。两者並不互斥,能跳轉就先跳轉。
canonical 只解决“哪個是首選”的表達問题,解决不了入口泛滥本身。内鏈、站点地图、重定向三處不统一,canonical 寫得再對,收敛效果也會打折。
容易忽略的几個细节
一是 canonical 必须指向可正常訪問的地址,中途跳轉或已失效的目标會让信号失效。二是多語言、多地区站点要区分清楚:同一語言的不同地区版本,和同一内容的不同副本,處理方式並不一样。三是内容本身确實有差异时,不要為了“凑干净”硬把两篇合並,用戶看到的内容和声明不一致,反而更麻烦。四是移動端與桌面端如果使用不同地址,需要在两端都正确声明對應關系。
建议把 canonical 检查放進栏目的常規巡检里:新增模板、改版、換域名、加統計參數之後各跑一次。發現問题按優先顺序處理——先修指向失效的,再修整站指错的,最後清理带參自指。處理完之後,观察日誌里蜘蛛對重复地址的抓取是否下降,用資料確認收敛是否生效,而不是改完就算結束。