跳到主要内容
← 全部指南

hreflang

hreflang 告诉搜索引擎:好几个页面是面向不同受众的同一份内容,好让它送出正确的那一个。这是一个它可以选择不听的信号,不是它必须遵守的指令。

保持集合可解释的四个规则

Hreflang 是一组注释,因此一侧的错误可能会影响 Google 解释关系的方式。谷歌表示,缺少返回链接或其他无效注释可能会被忽略或错误解释;它并不保证一个错误总是会导致整个集群失效。

  • 完整:组里每个版本都列出其余所有版本。
  • 相互:如果 X 指向 Y,Y 应该指向 X。缺少返回链接可能会导致注释被忽略或错误解释。
  • 自指:每个页面把自己也和其他版本一起列出来。
  • 有效:代码必须能读作真实的语言代码和地区代码。

相互性规则是吸引团队的规则,因为 hreflang 描述的是页面之间的关系,而不是孤立的一个页面的属性。一起推出相应的返回链接,以便当 Google 抓取任一端时,每个已发布的关系都是完整的。

注解放在哪里

有三种放法,效果等价。挑一种,全站都用它——在一个站里混着来,正是注解组落得只声明一半的原因。

方式适合要当心
HTML 的 link 元素中小型网站版本一多时的页面重量
HTTP 标头PDF 等非 HTML 文件大组时的标头大小上限
站点地图条目大型网站、多语言跟页面本身保持同步
HTML 的 link 元素
<link rel="alternate" hreflang="en" href="https://example.com/guide/" />
<link rel="alternate" hreflang="de" href="https://example.com/de/guide/" />
<link rel="alternate" hreflang="pt-br" href="https://example.com/pt-br/guide/" />
<link rel="alternate" hreflang="x-default" href="https://example.com/guide/" />

请注意示例里那个英文页面把自己也列了进去。这就是自指,而它的缺失是其他方面都很讲究的实现中最常见的缺陷,没有之一——因为它看起来多余,在任何一个来收拾模板的人眼里都像个笔误。

代码,以及那些并不存在的代码

语言用 ISO 639-1。后面可以选择性地跟一个连字符和一个 ISO 3166-1 Alpha 2 地区。只有地区永远无效:没有办法在不说明用什么语言的前提下说「这个页面是给加拿大的」。

代码判定为什么
zh有效只有语言——中文,不限地区
zh-TW有效为台湾地区书写的中文
TW无效有地区没有语言
uk有效,但不是英国uk 是乌克兰语;英国是 GB
eu作为地区无效欧盟不是国家代码
en-UK无效英国的国家代码是 GB

x-default 是拿来做什么的

x-default 接住那些你没有列出的语言。它是为语言和你任何一个版本都对不上的访客准备的退路,天然的位置是一个语言选择页,或者一个自己给访客分流的首页。

它不是用来指定主版本的。因为英语感觉像默认就把 x-default 指向英文页,等于告诉搜索引擎:一个没匹配上的日语或土耳其语访客应该拿到英文。这也许是对的,但值得刻意去决定,而不是顺手。

hreflang 和 canonical 是两件事

这两者比技术 SEO 里任何一对都更容易缠在一起,而且坏起来很重。canonical 说的是「请收录另外那个网址,别收录我」。hreflang 说的是「另外那个网址是面向另一群人的同一份内容」。

把德文页的 canonical 指向英文页,你就等于告诉搜索引擎德文页压根不该被收录——这会把它从结果里拿掉,同时还打断了引用它的那组 hreflang。每一个本地化页面都应当把 canonical 指向自己,再用 hreflang 去描述它的兄弟版本。

在你自己的网站上试试

问答

hreflang 能解决跨语言的重复内容吗?

它是定向信号,不是重复内容的解药。译文不是重复;hreflang 告诉搜索引擎哪个译文属于哪群人。

为什么排上去的是错的语言版本?

通常是回链那一组不完整,或者代码没通过校验。因为 hreflang 是信号,一组不被信任的注解会被搁到一边,搜索引擎退回自己的语言判断。

如果我所有页面都是一种语言,还需要 hreflang 吗?

只有当你用它去针对多个地区时才需要——比如 zh-CN 和 zh-TW,内容按市场有所不同。一种语言、一群受众的网站什么都不需要。

每个页面的 canonical 该指向自己还是原始语言?

指向自己。把译文的 canonical 指向源语言,等于告诉搜索引擎不要收录这个译文,结果是它从搜索里消失,指向它的那组 hreflang 也一并断掉。

x-default 应该指向哪里?

指向那个应当接待「语言你并未发布」的访客的地方——通常是语言选择页,或者一个自己分流的首页。它指定的是退路,不是主版本。

hreflang 是排名因素吗?

不是。它是定向信号,帮正确的版本找到正确的人。它不会抬高一个页面的排名,而且谷歌完全可以选择不理会这些注解。