如何使用 hreflang 标签:完整指南 + 免费工具

如果你的网站面向多种语言或多个国家/地区,hreflang 标签会告诉搜索引擎哪个 URL 对应哪类受众。一组有效的标签能帮助 Google 向不同受众展示正确的版本;一旦出错,Google 就可能在重复页面之间来回切换,甚至给错误的版本排名。本指南讲解 hreflang 的语法、返回标签(return tags)、x-default,以及那些会让整组注解悄悄失效的错误,并附上一款免费的 hreflang 标签生成器,可输出有效标签以及 XML sitemap 替代方案。

什么是 hreflang 标签?

hreflang 是 HTML <link> 元素上的一个属性,用于将一组 URL 标记为同一内容的不同本地化版本:

<link rel="alternate" hreflang="de-DE" href="https://example.com/de/" />

这个标签要放在每个语言版本的 <head> 中。

有两点很关键:hreflang 是一种提示(hint)而非指令(directive)——一组有效的标签能帮助 Google 展示正确版本,但无法强制它这么做。另外,Google 并不依靠 hreflang(或 lang 属性)来识别页面语言,而是通过算法自行判定。

hreflang 语法:语言、文字与地区代码

其取值遵循固定顺序——语言、可选的文字(script)、可选的地区(region)——分别取自 ISO 639-1、ISO 15924 和 ISO 3166-1 Alpha 2。代码不区分大小写;惯例是语言用小写、地区用大写。

有效代码示例:

  • en-GB — 面向英国用户的英语
  • zh-Hans — 中文,简体文字

以下是 Google 文档明确指出的陷阱:

  • en-UK — 无效:UK 不是正式分配的 ISO 3166-1 代码,因此 Google 会忽略它(EU 和 UN 同理);请使用 en-GB。
  • gb-en — 顺序错误:语言代码永远排在最前面。
  • es-419 — 不支持联合国数字地区代码,只支持 ISO 3166-1 Alpha 2。
  • 用 be 表示”比利时”——只写地区是无效的,而且 be 是白俄罗斯语的语言代码;应使用 nl-BE、fr-BE 或 de-BE。

对于同一语言的多个语言区域(locale),Google 的建议是:如果你面向同一种语言的多个区域(en-IE、en-CA、en-AU),就再提供一个通用的 en 兜底版本给其余所有用户。Google 称这”是个好主意”,但并非硬性要求;而且这个兜底版本可以与某个区域版本共用同一个 URL——en 可以与 en-IE 指向同一个 URL。

返回标签(Return Tags):为什么每个版本都必须互相指向

返回标签是一条互惠规则:如果页面 X 链接到页面 Y,Y 就必须链接回 X——而且每个版本还必须列出自身。Google 的规则是:两个页面若不互相指向,这些注解就会被忽略。业界常给出的理由是:如果没有返回链接,任何人都可以把自己的页面声明为你页面的备用版本。对于一个同时提供英语和德语版本的网站,两个页面的 <head> 中都包含同一组标签:

<link rel="alternate" hreflang="en" href="https://example.com/" />
<link rel="alternate" hreflang="de-DE" href="https://example.com/de/" />

两个页面都带有这两行;任何一个版本漏掉这组标签,整个集群就会开始失效。Google 文档也给出了一项放宽:当维护一套完整的双向标注变得困难时,可以在部分页面上省略部分语言——仍然互相指向的配对会继续生效。Google 明确给出的优先级是:把新增的语言版本与网站的源起(主导)语言双向关联——一个从法语 .fr 页面起家的网站,应先把新的西班牙语版本与法语页面互链,其次再让新版本之间互链。

什么是 x-default?什么时候需要它?

x-default 是一个保留值,用于指定当所列语言都与用户浏览器设置不匹配时应展示的 URL——只需额外加一个 link 标签,不带语言代码:

<link rel="alternate" hreflang="en-GB" href="https://example.com/uk/" />
<link rel="alternate" hreflang="x-default" href="https://example.com/select-language/" />

x-default 是可选项,但值得使用——它专为语言选择器页面和自动跳转的首页而设计。让它指向默认语言版本是另一种标准做法,也是本站生成器的预设。

实现 hreflang 标签的三种方法

Google 认为这三种方法完全等效;其文档指出,三种同时使用对搜索”没有任何好处”,而且比只用一种更难管理。

1. 放在 head 中的 HTML link 标签

适合小型网站:在每个版本的、格式规范的 <head> 中放入完整的一组标签。Google 有两条规则:标签必须真正位于 head 内部(如果你的 CMS 会改写标记,请以渲染后的 HTML 为准进行校验);不要把 hreflang 与 media 等属性合并进同一个标签。

2. XML sitemap 标注

规模较大时,建议不要把 hreflang 写进 HTML:在每个 <url> 条目内、<loc> 旁边,为每个版本(包括自身)各添加一个 xhtml:link 子元素:

<url>
  <loc>https://example.com/</loc>
  <xhtml:link rel="alternate" hreflang="en" href="https://example.com/" />
  <xhtml:link rel="alternate" hreflang="de-DE" href="https://example.com/de/" />
</url>

记得声明 xmlns:xhtml="http://www.w3.org/1999/xhtml" 命名空间,并为每个版本重复一个 <url> 块。子元素的顺序无关紧要;Google 也确认 xhtml:link 子元素不计入 sitemap 的 URL 数量上限——协议规定的 50,000 条 URL 上限只统计 <url> 条目。

3. HTTP Link 响应头

对于 PDF 等非 HTML 文件,在提供文件的位置设置 Link 响应头——以 nginx 为例,在该文件的 location 上加一条 add_header 规则:

add_header Link '<https://example.com/file.pdf>; rel="alternate"; hreflang="en",
                <https://example.com/de/file.pdf>; rel="alternate"; hreflang="de"';

Apache 的 Header set 或 CDN 的响应头规则也能实现同样效果。

如何用免费工具生成 hreflang 标签

hreflang 标签生成器会一边输入一边构建并校验标签组——无需注册,直接在浏览器中运行。

第 1 步:构建完整的标签组

每个版本添加一行——左侧填语言代码,右侧填绝对 URL——其中必须包含一行,让正在标注的页面指向它自己。自引用是必需项,而且这组完全相同的标签会被粘贴到每个版本的 head 中(见第 4 步)——所以请一次性把它构建完整。代码会按”语言-文字-地区”格式实时校验——en、pt-BR 和 zh-Hans 可以通过,gb-en 会被标出——大小写也会自动规范化(en-gb 会变成 en-GB)。

第 2 步:设置 x-default URL

输入兜底 URL——即你的默认语言版本或语言选择器页面——也可以留空以跳过 x-default。当该 URL 不在标签组内时会触发警告:如果它是选择器页面,这正常且正确,因为选择器页面本来就设计在语言集群之外;若并非选择器页面,则通常是 URL 拼写错误。

第 3 步:生成并查看检查结果

点击 Generate hreflang tags(生成 hreflang 标签)按钮。检查清单会把重复的语言代码标为错误,拒绝非绝对 URL,并就自引用和单条目的标签组发出警告。只有一条记录通常意味着其他版本还没加上——请补全它们,因为 hreflang 只有在两个或更多版本互相引用时才有意义;没有对应版本的页面根本不需要 hreflang。修正所有标红项,然后重新生成。

第 4 步:按所需格式复制输出

输出分为两个标签页。HTML link tags 可直接用于你的 <head>——把这份相同的代码块粘贴到每个版本里。XML sitemap 输出的是一个 <url> 块,而不是完整的 sitemap:请把它粘贴进完整 sitemap 的 <urlset> 元素内(命名空间见上文),例如 XML sitemap 生成器生成的基础文件。Copy code(复制代码)和 Download file(下载文件)用来导出结果;多语言 head 的其余部分可交给 meta 标签生成器。

hreflang 常见错误(及修复方法)

错误 1:漏掉自引用条目

最常见的错误:列出了所有版本,唯独漏了页面自己。Google 的规则恰恰相反——每个版本都必须列出自己以及其他所有版本。修复方法:为当前页面添加一行。

错误 2:单向标注(缺少返回标签)

德语页面列出了英语页面,反向链接却从未添加——Google 会忽略单向配对。修复方法:在每个版本上放置同一组标签;每次上线或更改 URL 后,重新检查两侧。

错误 3:无效或顺序错误的代码

en-UK、es-419、gb-en 或单独的地区代码——Google 会忽略无效地区或格式错误的代码,悄悄让集群的这一部分失效。修复方法:语言在前(ISO 639-1),地区在后(ISO 3166-1 Alpha 2);生成器会实时校验代码。

错误 4:hreflang 与 canonical 相互冲突

每个版本都应带有指向自身的 canonical。如果德语页面的 canonical 指向英语页面,就等于在 hreflang 宣称两者是平等备用版本的同时,又宣称其中一个是重复页面——两种信号相互冲突,可能让整组标签失效。修复方法:所有页面一律使用自指向 canonical,分组交给 hreflang。

错误 5:标签组中出现重定向或相对 URL

备用 URL 必须是完整限定(fully qualified)的——形如 https://example.com/de/,绝不能是 /de/ 或 //example.com/de/——而且应返回 200,而不是重定向链:如果 de-DE 条目 301 到了别处,Google 就得先解析这条重定向链。审计时用 重定向链检查器跑一遍所有 URL;并确认在渲染后的源代码中,标签位于格式规范的 head 之内。

常见问题

hreflang 标签能提升排名吗?

不能直接提升——hreflang 是一种路由信号,帮助 Google 展示正确的版本,而不是排名加分项。收益是间接的,但真实存在:互相竞争的重复版本更少,用户也能直接落到自己语言的页面上。

hreflang 标签必须放在 head 里吗?

只有采用 HTML 方法时才需要——此时它们必须位于格式规范的 head 内;当你无法控制 head 标记时,sitemap 和 HTTP 响应头方法是等效的替代方案。

x-default 是必需的吗?

不是。它是可选项,在语言选择器页面和自动跳转的首页上效果最佳。大多数其他网站让它指向默认语言版本,这是一种稳妥的做法。

hreflang 的 URL 可以分属不同域名吗?

可以——备用 URL 不必共用一个域名,这正是 hreflang 成为 example.de、example.co.jp 这类 ccTLD 标配的原因。ccTLD 或国家子域名能给 Google 提供地理提示,却无法说明哪些 URL 互为备用版本:请把每个版本都明确标注出来。

如何检查 hreflang 标签?修复需要多长时间生效?

查看每个版本渲染后的源代码,确认包括自引用在内的完整标签组都位于 head 内。第三方 hreflang 检测工具可以校验在线页面(Google 点名了 Aleyda Solis 的生成器和 Merkle 的 hreflang 检测工具),爬虫则能把检查扩展到整站;Search Console 的 International Targeting(国际定位)报告已于 2022 年下线,因此那里不再有专门的 hreflang 错误报告。修复会随着集群中每个 URL 被重新抓取而逐步生效——通常需要几天到几周。

可以为 en-US 和 en-GB 这类同语言页面使用 hreflang 吗?

可以——Google 自己举的用例就包括同一种语言的区域变体:面向美国、英国和爱尔兰的英语内容。翻译并非必需;这些标签只是告诉 Google 该展示哪个区域变体——有时两者的差异仅仅在货币或配送信息上。

如果标签组中某个版本被设置了 noindex 或被屏蔽,会怎样?

集群中的每个 URL 都应可抓取、可索引:设置了 noindex 或被屏蔽的页面无法作为备用版本展示,而且这条死条目会削弱其余版本的配对关系。要么解除屏蔽,要么把它从每个页面的标签组中删掉。

hreflang 的 URL 必须与 canonical URL 完全一致吗?

应当一致:每个条目填写的都是该版本 canonical 所指向的 URL——协议、主机名和末尾斜杠都要相同。条目必须是完整限定的 URL,非规范目标(如跟踪参数、多余的末尾斜杠)会迫使 Google 先解析重复页面再进行配对。完全一致的 URL 加上自指向 canonical,才能让集群保持干净。