Canonical标签是什么:告诉Google哪个URL代表本页,写错会怎样

倪叶明

作者

更新于

rel="canonical"写在重复页上,却指向别人。一条link元素,放在head区里,告诉Google另一个页面才代表本页的内容。它是Google说的强信号,不是必须写的东西,你不写,Google也会自己挑一个版本放进搜索结果。

对做出海站的人来说,麻烦在于重复URL是自己长出来的:带参数的、带www的、http和https的、大小写不一样的,一套内容能变出好几个地址。地址一多,链接信号被拆开,抓取时间也花在重复页上。先把地址收成一个,再谈内容。

  • 这是什么:head区里的一条link元素,指向代表本页的那个页面
  • 官方怎么说:强信号,不是强制项,可以和其他办法叠着用
  • 怎么做:重复页把地址指过去,首选页自己也加一条指向自己
  • 常见误区:拿robots.txt、URL removal tool、noindex去代替它

这篇讲的是canonical怎么让Google把多个重复URL合并成一个,以及写错之后会怎样,它属于SEO里站内结构那一层。

Canonical标签到底是什么,它解决的是哪个问题

官方的定义很短:一条放在head区的link元素,用来说明另一个页面代表本页的内容。它写在重复页上,指向代表页,方向跟直觉是反的。

一句话定义:head里的一条link,指向代表本页的另一个页面

完整形式长这样:<link rel="canonical" href="https://example.com/foo">。href里填你希望被当成代表的那个地址,写在重复页的head里,不是写在被代表的那一页上。

它只在head区才被接受,所以head至少要是合法的HTML。塞在body里,或者被模板搞乱了顺序,等于没写。Google支持RFC 6596描述的显式标注,这句话的意思是它认标准写法,不认各种变体。

它做的三件事

指定搜索结果里展示哪个URL。把相似页、重复页的信号合并到首选地址上,别的站链到重复URL,那些链接信号也会并过来。省抓取时间,Google不用把同一套内容反复抓。

两种给法:HTML里的link元素,或者HTTP头

HTML那种只对HTML页面有效,PDF这类文件用不了。HTTP头那种只对网页搜索结果支持,好处是能覆盖非HTML文档。比如.docx想说明自己的PDF版才是代表,就在.docx的响应里加一条Link指到那个PDF,地址用完整的https地址。

哪些写法会被忽略

带hreflang、lang、media、type属性的rel="canonical"不参与合并。这几种属性的本来用途是标alternate版本,混在canonical上,Google直接不当它是canonical。

页面上出现不止一个canonical标签,也会出意外。防重复内容这块的完整处理,站里另有一篇防重复内容。

Google凭什么信你指定的那个URL:三种方法从强到弱

官方把指定首选版本的三种方法按影响力排了序:重定向最强,rel="canonical"标注次之,sitemap收录最弱。三种都不是必须的。

Google官方文档说明canonical三种指定方法从强到弱的排序
官网说明截图:重定向最强,rel=“canonical“次之,sitemap最弱。

重定向强过rel="canonical",rel="canonical"又强过sitemap

重定向传达的意思是原来那个地址不用了,都去新地址。canonical标注说的是这两个地址内容一样,请把代表权给那一个,重复页本身还能访问,只是不当代表。sitemap更弱,它只是建议,Google还要按内容相似度自己判断哪些是重复页。

三种可以叠着用。同一个页面既做了重定向、又写了canonical、sitemap里也只放首选地址,首选URL出现在搜索结果里的机会,比只用一种高。

不指定会怎样

不写也行。官方原话是「your site will likely do just fine without specifying a canonical preference」,站点大概率照样正常跑,Google会自己判断哪个版本客观上更适合展示给用户。

所以canonical的定位是给建议,不是下命令。你给的建议和它自己的判断不一致,它按自己的判断来。这也是为什么写完要回Search Console看它到底选了哪个。

HTTPS默认优先,四种情况例外

同一套内容有HTTP和HTTPS两个版本时,Google默认把HTTPS当canonical。四种情况会反过来:HTTPS页证书无效;HTTPS页里有图片以外的不安全依赖;HTTPS页把用户重定向到HTTP或者中途经过HTTP;HTTPS页上的canonical指向了HTTP页。

证书还得对得上完整站点URL,或者是能覆盖同一域名多个子域名的通配符证书。给example.com装一张subdomain.example.com的证书,属于装错主机变体,这一条后面还会提到。

重复页怎么判定、信号合并的细节,可以对照Duplicate Content那一层去理解。

Canonical标签怎么设置:五步照着做

顺序不能乱,第一步写错,后面几步都是白忙。动手之前先把要改的页面列出来,写清楚哪个是代表页、哪些是重复页,别边改边想。

  1. 在重复页的head区加一条link元素,rel写canonical,href填代表页的地址。用绝对URL,写全https://和域名,别写/foo这种相对路径。相对路径Google支持,但长期会出问题,比如测试站被意外抓取了,相对路径会跟着测试站的域名跑。回查看href是不是完整URL,带https://和域名。
  2. 代表页自己也加一条,指向自己,这叫自引用canonical。官方建议这么做,少了这条,代表页就少了一次自我确认。回查看代表页有没有漏,只改重复页、忘了首选页,是常犯的。
  3. 如果代表页有一个独立URL的移动版,在代表页上加rel="alternate"指向移动版,别让移动版自己去猜哪个是代表。
  4. 加hreflang。每个语言或地区版本都要把自己列进去,也要列全其他版本,并且必须双向:A指向B,B也要指回A,缺了返回链接,这一组标注可能被忽略。alternate的地址要写完整,https://example.com/foo这种,不能写成//example.com/foo或/foo。
  5. sitemap里只放HTTPS版本,每个页面挑一个canonical地址提交。想最快见效,用服务端重定向,官方说HTTP重定向的见效最快。

这套动作做之前,先确认你的固定链接是干净的。带日期、带文章ID、带?p=123的地址,天生容易长重复页,URL固定链接和URL结构这两块先理一遍,比事后补canonical省事。

用CMS改不了HTML怎么办

WordPress、Wix、Blogger这类CMS,你不一定能直接改HTML。这类后台可能有搜索引擎设置页,或者别的机制来告诉你canonical填在哪儿。官方给的办法很土:在CMS的说明里搜「wordpress set the canonical element」。

装了SEO插件不等于配对。插件自动生成一条canonical,模板里又手写了一条,页面上就有两个标签了,谁生效不由你定。

用JS注入的写法与红线

官方给的JS写法是建一个link元素,把rel设成canonical,href设成拼好的地址,再挂到document.head上。红线有三条:能在源码里写就在源码里写;JS不要把它改成和源码里不同的值;页面上只能有一个rel="canonical"标签。

源码里实在写不了,那就干脆不写,只用JS设,别两边各写一个不一样的。JS注入最常见的错是模板和插件各加一次,第二个标签把第一个盖掉,或者两个打架,Google最后拿到的不是你想要的那个地址。

带参数URL、www/HTTP变体、分页、多语言:四类场景分别怎么写

带参数的URL

官方举的例子是?gclid=ABCD这种:带参数的地址把canonical指向干净地址,其他站链到带参数地址的信号,就会合并到干净地址上。这就是合并信号的实际效果。

哪些参数该留、哪些该丢,这篇不给规则。参数怎么处理取决于你的站怎么用这些参数,照搬别人的清单,容易把有用的参数一起砍掉。判断标准只有一条:这个地址和首选地址放出来的是不是同一套内容。

www、HTTP这些变体

同一套内容有HTTP和HTTPS两个版本,三种办法任选一种,也可以叠着用:把HTTP重定向到HTTPS;在HTTP页上加canonical指向HTTPS页;上HSTS。

反过来做就麻烦了。HTTPS页重定向回HTTP页,或者证书出问题,会让Google强烈偏好HTTP,上了HSTS也压不住这个偏好。

分页页面

分页的rel="next"、rel="prev"和canonical怎么配合,这篇不给做法。看到旧教程直接照搬之前,先确认它讲的是哪一年的规则,页面结构和参数一变,结论就不一样。

多语言页面

语言版本只有在主内容没翻译的情况下才算重复页。翻译过的版本不是重复内容,别拿canonical把它们互相指,那等于把不同语言的内容并成一个。

hreflang有三种写法:HTML的link标签、HTTP头、sitemap。三种在Google看来等价,挑一种最方便你的就行,三种一起上不会多出搜索收益,维护成本倒是三倍。

同一语言有多个地区版本时,建议再给一个面向该语言未指定地区用户的catchall地址。语言或国家选择器页、自动跳转的首页,加一个x-default做兜底。

项目 数值 / 规则
一条rel="canonical"能映射的重复页数量 无限
hreflang语言代码格式 ISO 639-1
hreflang地区代码格式 ISO 3166-1 Alpha 2,大写,只写地区不合法
不支持的代码示例 es-419、EU、UN、UK
sitemap里hreflang子元素 不计入sitemap的URL数量上限

数量不是限制。canonical能指多少个重复页没有上限,hreflang的语言和地区代码要用 ISO 639-1 和 ISO 3166-1 Alpha 2 格式。

十个最常见的canonical写错法,和排查顺序

这些错有一个共同点:都想拿别的工具去干canonical的活,或者同一个页面被发出了两个相反的指令。

用robots.txt做合并

不行。被robots.txt禁掉的URL照样可能被索引,只是索引里不带内容,内容藏起来了,页面还在。

用URL removal tool做合并

也不行。它会把一个URL的所有版本从搜索里隐藏。你要的是合并,它给的是全部消失。

用noindex代替canonical

不推荐。noindex会把页面彻底挡在搜索之外,canonical才是首选方案。站内想换一个代表页,用canonical指过去就行,别把原页面杀了。

同一页给了不同的canonical,或者把URL fragment当canonical

sitemap里指一个、rel="canonical"里指另一个,等于自己给自己发了两道相反的指令。URL fragment就是#后面那一串,Google一般不把它当独立地址,别拿它当canonical。

link元素和HTTP头同时用、用相对路径、JS注入出多个标签

两种给法建议只选一种。同时用最容易出现头里一个地址、link里另一个地址,这种错很难在页面上看出来,要抓响应头才看得到。相对路径的问题前面说过,长期会出问题。JS注入出两个标签,多半是模板和插件各写了一次。

证书装错主机变体、HTTPS到HTTP重定向

这两个动作最伤HTTPS的优先权。证书要对得上完整站点URL,HTTPS页别往HTTP页重定向。这两种情况一出现,Google会强烈偏好HTTP,HSTS也盖不过。

排查顺序

  1. 在Search Console的URL Inspection里,分别查首选页和一个重复页,看Google选的canonical是不是你指定的那个。不是你指定的,问题在这一层就暴露了。
  2. 看源码里是不是只有一个canonical标签、href是不是绝对URL。多个标签、相对路径,这一层就能看出来。
  3. 看sitemap和hreflang有没有互相打架:sitemap里放的是不是HTTPS版本,hreflang里每个版本是不是都列全了、有没有返回链接。

这套顺序属于技术SEO自查里的常规动作,完整清单看技术SEO自查。标签本身写错的是少数,多数是几个信号互相打架,先把方向统一了再看细节。

AI能帮你做哪几步,哪几步必须自己动手

这块的活分成两类。一类是对照和整理,AI干得比人快;一类要落到具体页面上,只能你亲手点。

  1. 把站点里带参数、带www和HTTP、大小写不同的URL列表丢给AI,让它按「是不是同一套内容」分组,标出每组该选哪个当canonical。
  2. 让AI按官方示例生成head里的link代码,或者生成sitemap里的xhtml:link结构。
  3. 让AI拿规则清单逐条对照你现有的写法,列出踩了哪几条。
  4. 让AI把hreflang的三种写法互相对照,看每个版本是不是都列全了,包括自己。

下面三条提示词是本文给的示例,不是官方模板,措辞可以按你的情况改。

  • 「下面是一批URL,请按内容是否相同分组,每组给出建议的canonical URL,并说明理由。只按我给的信息判断,不要猜。」
  • 「按Google官方示例,为下面这组重复页生成head里的link rel="canonical"代码,canonical页自己也要有一条自引用,用绝对URL。」
  • 「对照这份规则清单检查我贴的canonical代码:是否用了robots.txt、是否用了noindex、是否同一页给了不同canonical、是否用了相对路径、是否用了URL fragment。逐条说命中没命中。」

猎者出海的AI Agent在这一段的活是上线后的每周改稿单:它自己拉数据,给出先改哪几篇、改什么。

剩下这三个动作必须你自己做,AI替不了:

  1. 在CMS后台或模板文件里找到head区,亲手填rel="canonical"的href值,确认是绝对URL。
  2. 在Search Console的URL Inspection里对首选页和重复页各查一次,看Google选的canonical是不是你指定的那个,据此决定改哪一页。
  3. 在sitemap文件里确认列的是HTTPS版本,每个url的xhtml:link子元素列全了,包括自己。

常见问题

不写canonical会怎样?

站点大概率照样正常跑。Google会自己判断哪个版本更适合展示,你只是把选择权交出去了,最后哪个版本被选中不由你定。

canonical设置后多久生效?

这个没有固定的时间表,看Google什么时候重新抓、重新判断。改完就去Search Console里查首选页和重复页,看它选的canonical变了没有,没变就回源码和sitemap继续查。

canonical能提升排名吗?

它管的是合并重复页的信号、指定搜索结果里展示哪个URL。

用WordPress怎么设canonical?

在后台或模板里改head,或者用CMS给的搜索引擎设置项。官方给的办法是在CMS说明里搜「wordpress set the canonical element」。设完看一次源码,确认页面上只有一条。

多语言页面要不要标hreflang?

即使不标,Google也可能找到你的其他语言版本,但显式标出来通常更好。标的时候每个版本都要列全,包括自己,而且必须双向指。

canonical和sitemap冲突了听谁的?

别让它们冲突,同一个页面在两边给同一个地址。真冲突了,canonical的信号比重定向弱、比sitemap强,最后怎么选还是Google判断,先改到一致最省事。sitemap怎么交,看网站地图sitemap。

相关文章:canonical只是站内结构的一环,其余的检查项在站内SEO优化清单里。

最后说一句:canonical是建议,不是命令。你能做的是把三个信号给成同一个方向,重定向、canonical、sitemap都指向那个地址,剩下的交给Google判断。改完记得回Search Console看一眼它选了谁。上线之后每周那张改稿单,猎者出海的AI Agent会自己拉数据给你列出来。

发表评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注