保持集合可解释的四个规则
Hreflang 是一组注释,因此一侧的错误可能会影响 Google 解释关系的方式。谷歌表示,缺少返回链接或其他无效注释可能会被忽略或错误解释;它并不保证一个错误总是会导致整个集群失效。
- 完整:组里每个版本都列出其余所有版本。
- 相互:如果 X 指向 Y,Y 应该指向 X。缺少返回链接可能会导致注释被忽略或错误解释。
- 自指:每个页面把自己也和其他版本一起列出来。
- 有效:代码必须能读作真实的语言代码和地区代码。
相互性规则是吸引团队的规则,因为 hreflang 描述的是页面之间的关系,而不是孤立的一个页面的属性。一起推出相应的返回链接,以便当 Google 抓取任一端时,每个已发布的关系都是完整的。
注解放在哪里
有三种放法,效果等价。挑一种,全站都用它——在一个站里混着来,正是注解组落得只声明一半的原因。
| 方式 | 适合 | 要当心 |
|---|---|---|
| HTML 的 link 元素 | 中小型网站 | 版本一多时的页面重量 |
| HTTP 标头 | PDF 等非 HTML 文件 | 大组时的标头大小上限 |
| 站点地图条目 | 大型网站、多语言 | 跟页面本身保持同步 |
<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 去描述它的兄弟版本。