canonical 怎么用

工具相关 ·

同一个页面,用户可以通过好几个不同的地址访问:带 www 的和不带的、http 的和 https 的、带追踪参数的和不带的。在用户看来这些都是「同一个页面」,但在搜索引擎看来它们是不同的 URL,可能被分别收录,导致同一个内容在搜索结果里出现多次,权重被分散。canonical 标签就是用来解决这个问题的。

它声明的是什么

<link rel="canonical" href="..."> 的作用是声明「这个页面的规范地址是哪一个」。

它是一个提示,不是强制指令。搜索引擎会参考这个声明,把多个地址归并到一个规范地址上,把权重集中到那一个。

需要理解的是,canonical 解决的是「同一内容多个地址」的问题,不是「内容重复」的问题。如果两个页面内容相似但确实是不同页面(比如同一个产品的不同型号页),不应该用 canonical 把其中一个指向另一个。

三个使用要点

第一,必须是绝对地址。

href 里要包含完整的协议和域名,例如 https://www.example.com/page。写相对路径(/page)是常见的错误,虽然部分实现会容错处理,但规范要求绝对地址,写完整更稳妥。

第二,每个页面都要写,指向自己的规范地址。

这一点容易被忽略。很多人只在「有问题」的页面上写 canonical,比如带参数的页面指向不带参数的版本。但实际上,规范页面本身也应该写一条 canonical 指向自己。

这样做的好处是明确声明了「这个地址就是规范地址」,避免搜索引擎在多个候选地址之间犹豫。同时也防止了其他页面误声明指向自己时产生的冲突。

第三,分页页面指向当前分页,而不是第一页。

这是一个常见错误。列表页的第 2 页、第 3 页是独立的页面,用户可以直接访问它们、搜索引擎可以顺着它们发现深层内容。如果把这些页面都 canonical 到第 1 页,等于告诉搜索引擎「第 2 页和第 3 页都是重复内容」,结果它们不会被收录,深层的内容也就难以被发现。

正确的做法是每个分页页面 canonical 到自己。

与 noindex 的冲突

如果一个页面上同时有 canonical 和 noindex,会产生矛盾的信号。

canonical 说「这个页面的规范版本是那个地址」,隐含的意思是「请把这个页面归并过去」。noindex 说「不要收录这个页面」。搜索引擎收到两个相反的信号,处理方式不确定——可能忽略 noindex 而按 canonical 处理,也可能相反。

所以这两个标签不应该同时出现在一个页面上。如果页面需要 noindex,通常就不需要 canonical;如果页面需要 canonical 做归并,就不应该 noindex。

其他声明规范地址的方式

除了 canonical 标签,还有几种方式会影响搜索引擎对「规范地址」的判断。

重定向。如果旧地址 301 重定向到新地址,搜索引擎会把权重传递过去。这比 canonical 更强,因为它直接告诉浏览器和爬虫「这个地址已经永久搬家」。

sitemap。sitemap 里列出的地址被搜索引擎视为「站长认可的规范地址」。所以 sitemap 里应该只放规范地址,不要把带参数的重复地址塞进去——那会与 canonical 声明矛盾。

robots.txt。Disallow 会阻止抓取,但不能阻止收录,所以它不适合用来处理重复内容。

内部链接。页面内部链接到其他页面时,用的地址应该与规范地址一致。如果内部链接大量指向带参数的地址,会向搜索引擎传递混乱的信号。

这几种方式中,canonical 是最灵活的一种(不需要改服务器配置),重定向是最强的一种(适用于地址真的变了的情况)。实践中通常配合使用:地址真的变化时用 301,同一地址的多种表现形式用 canonical。

常见的配置错误

canonical 指向了不存在的页面。如果 href 写错或者目标页面已经删除,搜索引擎会忽略这个声明,页面按自己的地址被收录。

canonical 指向了另一个域名的页面。跨域 canonical 是允许的(比如内容同时发布在两个站点时),但需要确认对方也认可这个关系,否则可能被当作异常信号。

模板里硬编码了 canonical。如果站点的 canonical 是模板里写死的固定地址,那么所有页面都会声明自己是同一个规范地址。这会导致严重的收录问题——搜索引擎可能认为整站都是重复内容。canonical 必须动态生成,指向当前页面自己的规范地址。

http 与 https 混用。如果站点已经全面启用 HTTPS,canonical 就应该指向 https 版本。混用会让搜索引擎难以判断哪个是规范版本。

检查清单

  • canonical 声明页面的规范地址,用于归并同一内容的不同地址形式
  • 必须是含协议与域名的绝对地址
  • 每个页面都要写,且指向自己的规范地址
  • 分页页面 canonical 到当前分页,不要指向第一页
  • 不要与 noindex 同时使用,两者信号矛盾
  • 地址真的变化时用 301 重定向,同一地址的多种形式用 canonical
  • canonical 必须动态生成,模板硬编码会导致整站被判为重复内容
阅读 15