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 是一条声明,不是一道命令。写之前先想清楚:这些地址里,你到底希望蜘蛛记住哪一个。