canonical 标簽的作用是告诉搜尋引擎:在若干個内容相同或高度相似的頁面里,哪一個是你希望被当作正本的那一個。它不是指令,而是提示,但用得規范,能减少重复頁面互相竞争,也能让抓取和索引的信号更集中。
先分清 canonical 想解决什么問题
典型场景是同一篇内容有多個可訪問地址:带不带參數、带不带末尾斜杠、http 與 https 同时可達、打印版與正文版並存。這些地址内容一致,用戶看哪個都行,但搜尋引擎需要知道以哪個為准。canonical 就是在這個层面上工作的,它管的是索引层面的去重,而不是抓取层面。
如果你的目的是阻止抓取,用 robots.txt;如果是不想让某個頁面進入索引,用 noindex;canonical 是合並信号,三者的分工不要寫反。
自引用 canonical:最容易被忽略的預設動作
大部分頁面應该在自己頁面上寫一個指向自身 URL 的 canonical。它看起来多余,實际能起到锚定作用:当頁面通過不同參數被訪問时,自引用 canonical 會把這批地址指向同一個規范形式。
- 用绝對地址,包含协议和主机名,避免相對路径在不同层級下解析出错。
- 地址要和站点地图、内鏈里使用的形式保持一致,大小寫和末尾斜杠统一。
- 分頁列表的每一頁都應该自引用,而不是全部指向第一頁,否則後面几頁的内容會被视為重复,逐渐失去索引。
跨頁面指向:什么时候可以用
当两個地址的内容基本一致,只在展示方式上有差別时,可以考虑跨頁面 canonical。常见的判断标准是:把两個頁面的正文抽出来對比,如果主体内容相同,只是排序、视图或来源不同,指向正文版是合理的。
适合的场景
- 同一内容的打印版、纯文本版、無样式版。
- 带會话 ID 或追踪參數的地址指向干净地址。
- 多個入口地址指向同一個詳情頁。
不适合的场景
- 两個頁面主体内容不同,只是主题相近。强行合並會让其中一頁的内容失去被索引的机會。
- 把首頁或栏目頁当作所有子頁的 canonical,這属于把不同层級的内容压成一頁。
- 用 canonical 代替 301 做站内迁移,舊地址仍可訪問,用戶和蜘蛛都會繼續走到舊頁。
几種常见誤用
- 頁面里出現多個 canonical。搜尋引擎通常會忽略全部或只采信其中一個,结果不可控,最好只保留一個。
- canonical 指向重定向地址或 404。指向的 URL 本身不可直接訪問时,這個信号基本失效。
- canonical 與 noindex 同时用在同一頁。两個信号互相抵消,容易让頁面處于不确定狀態,只保留你真正想要的那個。
- 由脚本動態插入 canonical,且首屏 HTML 里没有。渲染前的初始 HTML 缺這個标簽,抓取时看到的版本可能與预期不同。
服務端與渲染层面的注意点
如果站点有缓存,改版後舊缓存里的 canonical 可能還指向老地址,需要確認缓存刷新策略。用 CDN 时也要注意,不同节点返回的 HTML 是否一致。對于前端渲染的頁面,最好让服務端直接輸出 canonical,而不是等脚本执行完再补。
上线前的检查清單
- 抽查頁面的 canonical 是否為绝對地址、能否正常訪問、是否與自身 URL 一致。
- 對比站点地图中的 URL 與 canonical,两者不一致的地方逐個確認原因。
- 確認分頁、參數頁没有被错誤地合並到第一頁。
- 改版或合並内容後,复盘 canonical 是否需要同步調整。
canonical 本身不复杂,难的是保持前後一致。把它当成站点结构的一部分来维護,定期抽查,比一次性配置完就不再過問要稳妥得多。