canonical URL 是在告诉 Google「展示同一内容的这堆 URL 里,这个才是原版」。设对了,重复内容不会再吃你的排名;设错了,Google 会默默把你一半的页面从索引里踢掉。
问题背景
<link rel="canonical" href="..."> 标签是为了解决 web 上的 URL 重复乱象——同一页在 www 和裸域名都能访问、带不带结尾斜杠、带 tracking 参数、分页、AMP、不同语言变体。canonical 把这些都指向一个首选 URL。Google 仍然把它当成提示而不是命令,但只要你设对,90% 的情况它会照办。
判断标准
- Pages 报告里出现「Duplicate without user-selected canonical」或「Google chose different canonical than user」。
site:你的域名同时返回www.版和裸域名版的同一篇文章。- 带 tracking 参数的 URL(
?utm_source=...)被收录了,而干净版没被收录。 - 同一篇内容你出了中英两版,Google 不知道排哪个。
快速结论
每个页面都加一个自指 canonical——<link rel="canonical" href="https://yoursite.com/articles/slug/">。真重复的页面(带参数、分页、被转载的),让它们指向主 URL。不要玩跨域名或跨语言 canonical——语言用 hreflang,跨域名用 301。
实操步骤
- 审查现状。在 5-10 个页面 view source,搜
rel="canonical",确认每页有且只有一个,指向自己的公开 https、不带参数版本。 - 挑一个主机:
https://yoursite.com或https://www.yoursite.com。另一个要301跳到它。光靠 canonical 不够,必须配 redirect。 - 分页列表(
/blog/page/2)每页 canonical 指自己,不要全指 page 1。全指 page 1 会让后面的页面被隐藏、影响发现。 - 带 tracking 参数的 URL,canonical 要把参数去掉:
?utm_source=twitter-> canonical 写https://yoursite.com/articles/slug/。 - 多语言站,不要把 zh 页面 canonical 到 en 版本,或反过来。每个语言版本各自自指 canonical,互相用
hreflang引用。 - 部署后,在 Search Console URL Inspection 抽 3-4 个 URL,看「Google-selected canonical」是否和你声明的一致。不一致说明你的提示被覆盖了——先查清楚原因再做别的。
容易踩的坑
- 把所有页面 canonical 到首页(坏掉的 CMS 插件经典操作)。整站收录直接掉光。
- 把中文页 canonical 到英文页。Google 会把中文页从中文索引里踢掉,你少一半流量。
- canonical 指向一个返回
404或301的 URL。Google 会忽略并自己挑一个 canonical,通常挑错。 - 用了 staging 域名的绝对 URL(
staging.yoursite.com),上线时忘改。线上页面 canonical 指向了一个非公开 staging。 - canonical 和实际 URL 之间 http/https、www/非 www 不一致。必须一字不差完全一样。
这篇适合谁
Search Console 已经显示了重复内容报告的站,或者同时有分页、tracking 链接、多子域名的任意组合。
这篇不适合谁
全新的 5 页小站、没参数、没分页、单语言。一个自指 canonical 就够了,等你扩张再回来看这篇。
FAQ
- 什么叫自指 canonical?: 页面 canonical 指向自己干净的 URL。每个页面都应该有一个——告诉 Google「这就是这份内容的标准 URL」。这是最安全的默认值,能阻止 Google 自己挑一个奇怪的 canonical。
- 我声明了 canonical,但 Google 选了另一个怎么办?: 通常是你的 canonical 和其他信号冲突——内链指向别的 URL、sitemap 里写的别的 URL、
hreflang引用的别的 URL。让所有信号一致,Google 就会尊重你的提示。 - 能跨域名 canonical 吗?: 技术上可以,但只在「内容被转载、希望原版排名」的场景。其他所有情况用
301redirect——更可靠。 - 重复页面应该 canonical 还是
noindex?: 两个 URL 都服务真实用户(比如分类页和搜索结果页展示同一组产品)用canonical;其中一个纯内部用(比如购物车、admin)用noindex。两者不能互换。