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收录最弱。三种都不是必须的。

重定向强过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标签怎么设置:五步照着做
顺序不能乱,第一步写错,后面几步都是白忙。动手之前先把要改的页面列出来,写清楚哪个是代表页、哪些是重复页,别边改边想。
- 在重复页的head区加一条link元素,rel写canonical,href填代表页的地址。用绝对URL,写全https://和域名,别写/foo这种相对路径。相对路径Google支持,但长期会出问题,比如测试站被意外抓取了,相对路径会跟着测试站的域名跑。回查看href是不是完整URL,带https://和域名。
- 代表页自己也加一条,指向自己,这叫自引用canonical。官方建议这么做,少了这条,代表页就少了一次自我确认。回查看代表页有没有漏,只改重复页、忘了首选页,是常犯的。
- 如果代表页有一个独立URL的移动版,在代表页上加rel="alternate"指向移动版,别让移动版自己去猜哪个是代表。
- 加hreflang。每个语言或地区版本都要把自己列进去,也要列全其他版本,并且必须双向:A指向B,B也要指回A,缺了返回链接,这一组标注可能被忽略。alternate的地址要写完整,https://example.com/foo这种,不能写成//example.com/foo或/foo。
- 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也盖不过。
排查顺序
- 在Search Console的URL Inspection里,分别查首选页和一个重复页,看Google选的canonical是不是你指定的那个。不是你指定的,问题在这一层就暴露了。
- 看源码里是不是只有一个canonical标签、href是不是绝对URL。多个标签、相对路径,这一层就能看出来。
- 看sitemap和hreflang有没有互相打架:sitemap里放的是不是HTTPS版本,hreflang里每个版本是不是都列全了、有没有返回链接。
这套顺序属于技术SEO自查里的常规动作,完整清单看技术SEO自查。标签本身写错的是少数,多数是几个信号互相打架,先把方向统一了再看细节。
AI能帮你做哪几步,哪几步必须自己动手
这块的活分成两类。一类是对照和整理,AI干得比人快;一类要落到具体页面上,只能你亲手点。
- 把站点里带参数、带www和HTTP、大小写不同的URL列表丢给AI,让它按「是不是同一套内容」分组,标出每组该选哪个当canonical。
- 让AI按官方示例生成head里的link代码,或者生成sitemap里的xhtml:link结构。
- 让AI拿规则清单逐条对照你现有的写法,列出踩了哪几条。
- 让AI把hreflang的三种写法互相对照,看每个版本是不是都列全了,包括自己。
下面三条提示词是本文给的示例,不是官方模板,措辞可以按你的情况改。
- 「下面是一批URL,请按内容是否相同分组,每组给出建议的canonical URL,并说明理由。只按我给的信息判断,不要猜。」
- 「按Google官方示例,为下面这组重复页生成head里的link rel="canonical"代码,canonical页自己也要有一条自引用,用绝对URL。」
- 「对照这份规则清单检查我贴的canonical代码:是否用了robots.txt、是否用了noindex、是否同一页给了不同canonical、是否用了相对路径、是否用了URL fragment。逐条说命中没命中。」
猎者出海的AI Agent在这一段的活是上线后的每周改稿单:它自己拉数据,给出先改哪几篇、改什么。
剩下这三个动作必须你自己做,AI替不了:
- 在CMS后台或模板文件里找到head区,亲手填rel="canonical"的href值,确认是绝对URL。
- 在Search Console的URL Inspection里对首选页和重复页各查一次,看Google选的canonical是不是你指定的那个,据此决定改哪一页。
- 在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会自己拉数据给你列出来。

发表评论