站点跑久了,经常會遇到同一篇内容能用好几個地址打開。带 www 和不带 www 各一份,加個跟踪參數又是一份,列表頁和詳情頁還可能撞在一起。這时候搜尋引擎看到的是多份“看起来一样”的内容,需要你自己告诉它哪一份才是正主。canonical(規范連結)就是干這個的。
先搞清楚 canonical 解决什么問题
canonical 标簽寫在頁面 head 里,指向你希望被当作主版本的地址。它的作用是给出“合並信号”,而不是屏蔽。也就是说,搜尋引擎可能會把几個相似地址的信号合並到 canonical 指向的那個地址上,但最终如何處理仍由搜尋引擎判断,不是寫上去就一定生效。
要区分清楚三件事:
- 301 重定向:真正把用戶和蜘蛛挪到新地址,舊地址不再獨立存在。
- canonical:多個地址都能正常訪問,但你指定其中一個為主版本。
- robots.txt 屏蔽:直接不让抓,但已经被抓到的舊地址可能仍留在索引里。
能重定向的就別用 canonical 兜底;canonical 是给“确實需要並存”的地址准备的。
自查:常见的多地址来源
1. 域名與协议變体
- http 與 https 是否都還能訪問,canonical 是否统一指向 https。
- 带 www 與不带 www 是否有一個是重定向,另一個才是主站。
- 大小寫混用:/About 和 /about 是否都能打開。
2. 尾斜杠與路径寫法
/post/1 和 /post/1/ 在很多服務器上都能訪問。如果两者都返回 200,就要確認 canonical 是否只指向其中一種,並保持一致,別這篇文章指带斜杠、那篇指不带。
3. 追踪參數與篩選參數
推廣連結带的 utm 參數、列表篩選带的排序參數,都會生成新的地址。建议在 canonical 里始终輸出不带這些參數的干净版本。如果參數组合太多,還要配合 robots 規則或連結規范一起處理。
4. 分頁、打印頁、移動版
- 分頁的第 2、3 頁通常應该自指 canonical(指向自己),而不是全部指回第 1 頁。
- 打印頁、纯文本版一般指向對應的正文頁。
- 獨立移動版地址(如 m 站)需要與桌面版互相标注,並確認 canonical 指向哪一邊。
容易踩的几個坑
canonical 指向了不能正常返回的地址
指向 404、指向 301 的中間地址、指向被封禁的地址,都會让信号變得模糊。canonical 的目标地址應当是返回 200 的最终地址。
一個頁面寫了多個 canonical
模板拼接、插件叠加都可能造成輸出两個甚至更多 canonical。搜尋引擎通常會忽略全部或自行選擇,等于白寫。建议直接在頁面源碼里搜一下 canonical 出現的條數。
全站模板里 canonical 寫死成首頁
這是最伤的一種:所有頁面都指向首頁。结果是大量内容頁被当成首頁的副本。模板里應该是動態輸出目前頁面的規范地址。
canonical 與 hreflang 互相打架
多語言站点里,如果每個語言版本的 canonical 都指向同一個語言版本,其他語言頁就可能被合並掉。一般是各語言頁自指 canonical,再用 hreflang 互相關联。
日常怎么查
- 抽一批代表頁面(首頁、栏目頁、詳情頁、分頁、带參頁),打開源碼看 canonical 的實际輸出。
- 把站内主要地址和 canonical 列表對照,找出指向異常、指向非 200、指向站外的條目。
- 看服務器日誌里被抓取的带參地址,判断哪些本该合並到正文。
- 如果地址结构有過調整,检查老頁面的 canonical 是否還指着一個早已废弃的地址。
- 每次改模板、加插件、換域名之後,把 canonical 列入回归检查項。
canonical 不是寫完就不用管的東西。站点结构、URL 規則、模板一變動,它就可能失准。把它当成一項常規巡检,比等到發現流量分散了再回头找原因省事得多。