canonical(rel="canonical")是頁面里的一句话:這份内容真正的地址是哪一個。用得好,能减少多個地址互相分散;用错,等于亲手把蜘蛛引向別處。
canonical 到底解决什么問题
同一份内容出現多個可訪問地址是很常见的:带參數的活動連結、HTTP 與 HTTPS 並存、带 www 與不带 www、打印頁、移動版頁面等。canonical 的作用是声明這些地址里哪個是首選版本。
要清楚它的定位是建议而不是指令,最终判断權仍在對端。它也不能替代重定向:如果舊地址本就不该再被訪問,用 301 更干净。
自引用 canonical:最基础也最容易漏
每個正常頁面都應该有一條指向自己的 canonical,地址與目前頁面的規范地址完全一致,包括协议、域名、路径、大小寫和结尾斜杠。
漏掉自引用本身不一定立刻出問题,但当頁面被多個參數地址訪問时,缺少這條声明會让版本判断變得模糊。
寫法上的几個要点
- 使用绝對地址,寫全 https:// 與域名,避免相對路径带来的歧义。
- 一個頁面只寫一條 canonical,不要重复出現多個标簽。
- 大小寫、结尾斜杠、參數顺序要和頁面對外的主地址保持一致。
- 指向的目标必须可訪問且返回 200,不要指向 404、301 或者被 robots 屏蔽的地址。
- 不要跨域名乱指,除非确實是同一内容的分站或镜像關系。
- 移動端與桌面端是两套地址时,桌面版指向自身、移動版指向桌面版是常见做法,但要與站点整体策略一致。
几個容易打架的组合
canonical 與 noindex 同时出現
一個頁面既声明 canonical 指向 A,又加了 noindex,信号是矛盾的。常见结果是這個頁面不被保留,但它未必會按你的设想把價值传给 A。两者通常選一個用。
canonical 與 301 混着用
如果 A 頁面 301 到 B,B 又 canonical 回 A,就形成閉环。蜘蛛在中間来回绕,最後可能两個地址都得不到明确结论。改版或合並内容时,先把跳轉關系理清,再补 canonical。
分頁與篩選頁
列表頁的翻頁不要全部 canonical 到第一頁,那會让後續頁面的内容被忽略。篩選參數生成的地址,更合理的做法是治理參數本身,或者對無價值的组合做屏蔽,而不是一律指向列表主頁。
上线前的自查清單
- 随机抽 20 個頁面,检查 canonical 是否指向自己,且與目前 URL 完全一致。
- 搜尋全站模板,確認没有把 canonical 寫成固定的主頁地址。
- 检查 canonical 目标地址的返回碼,確認是 200。
- 检查是否與 noindex、robots 屏蔽、301 存在冲突。
- 活動頁、专题頁這類临时地址,確認指向的是你真正想保留的版本。
- 用爬虫工具跑一遍,把 canonical 指向與预期不一致的頁面列出来逐條確認。
別把它当成重复内容的萬能解药
canonical 處理的是同一份内容的多個地址,不是两篇相似但不同的文章。如果两個頁面内容确實不同,硬指到同一處,反而會让其中一個頁面的價值被抹掉。
canonical 是一條声明,不是一道命令。寫之前先想清楚:這些地址里,你到底希望蜘蛛记住哪一個。