国际化 hreflang:多语言多地区站点配置实战
当一个网站有多个语言或地区版本时,搜索引擎需要知道:该给中国用户看中文版,给美国用户看英文版,而不是把所有版本混在一起当成重复内容。hreflang 就是解决这个问题的标准方案。这篇文章讲清 hreflang 的作用、语言地区代码怎么写、三种实现方式如何选,以及那些极容易出错、却又最容易被忽视的细节。
hreflang 是什么#
hreflang 是一个用来告诉搜索引擎"同一内容存在哪些语言/地区版本、各自的 URL 是什么"的属性。它帮助搜索引擎在搜索结果中为用户匹配最合适的版本。
它解决两个核心问题:
- 正确匹配:让说西班牙语的用户看到西语版,说日语的用户看到日语版,提升相关性和点击率。
- 避免重复内容误判:同一篇文章的多语言翻译,或面向不同地区的相似内容(如英美两版英文),不会被当成重复内容互相竞争。
什么时候需要 hreflang#
hreflang 只在以下情况有意义。如果不符合,就不需要配置:
| 场景 | 是否需要 |
|---|---|
| 同一内容有多种语言翻译(中文 / 英文 / 日文) | ✅ 需要 |
| 同一语言面向不同地区(en-US / en-GB,价格货币不同) | ✅ 需要 |
| 语言相同、地区不同但内容几乎一致 | ✅ 需要(避免重复) |
| 只有一种语言、一个地区 | ❌ 不需要 |
| 不同页面是不同内容(非互译) | ❌ 不需要 |
语言与地区代码#
hreflang 的值由语言代码(必需)和地区代码(可选)组成,格式为 语言 或 语言-地区:
- 语言代码:使用 ISO 639-1,两个小写字母,如
zh(中文)、en(英文)、ja(日文)。 - 地区代码:使用 ISO 3166-1 Alpha-2,两个大写字母,如
US(美国)、GB(英国)、CN(中国)。
| hreflang 值 | 含义 |
|---|---|
en | 英语(不限地区) |
en-US | 美国英语 |
en-GB | 英国英语 |
zh | 中文(不限地区) |
zh-Hans | 简体中文(脚本代码) |
zh-Hant | 繁体中文(脚本代码) |
x-default | 默认兜底版本(特殊值) |
zh-CN 当"简体"用——CN 指中国大陆地区。要区分简繁体应使用脚本代码 zh-Hans / zh-Hant。另外没有 en-UK 这种写法,英国是 GB;也不要用 en_us(下划线、小写)这类错误格式。三种实现方式#
hreflang 有三种等效的实现方式,选一种即可(不要重复或混用)。
| 方式 | 位置 | 适合 |
|---|---|---|
HTML <link> 标签 | 每个页面的 <head> | 页面数量适中的 HTML 站点 |
| HTTP 响应头 | 服务器响应头 | 非 HTML 文件(PDF 等) |
| XML Sitemap | sitemap 中的 xhtml:link | 大型站点,集中管理 |
方式一:HTML link 标签
在每个页面的 <head> 中列出所有语言版本(包括它自己)。假设有中、英、日三个版本:
<link rel="alternate" hreflang="zh" href="https://example.com/zh/page.html">
<link rel="alternate" hreflang="en" href="https://example.com/en/page.html">
<link rel="alternate" hreflang="ja" href="https://example.com/ja/page.html">
<link rel="alternate" hreflang="x-default" href="https://example.com/en/page.html">
方式二:XML Sitemap
在 sitemap 中为每个 URL 用 xhtml:link 声明其语言替代版本。适合大型站点集中维护,细节见 Sitemap 网站地图。
<url>
<loc>https://example.com/zh/page.html</loc>
<xhtml:link rel="alternate" hreflang="zh" href="https://example.com/zh/page.html"/>
<xhtml:link rel="alternate" hreflang="en" href="https://example.com/en/page.html"/>
</url>
方式三:HTTP 响应头
用于 PDF 等非 HTML 资源,在响应头中声明:
Link: <https://example.com/en/doc.pdf>; rel="alternate"; hreflang="en",
<https://example.com/zh/doc.pdf>; rel="alternate"; hreflang="zh"
最关键的规则:双向对应#
这是 hreflang 最重要、也最常被做错的一条规则:hreflang 必须互相确认。如果 A 页面声明 B 是它的英文版本,那么 B 页面也必须声明 A 是它的中文版本。任何一方缺失,这组关系都会被搜索引擎忽略。
而且,每个页面列出的版本列表里必须包含它自己(自我引用)。也就是说,三语言站点的每个页面,head 里都应该有完整的三条(或四条,含 x-default)声明,且三个页面的这组声明内容完全一致。
x-default 的作用#
x-default 是一个特殊的 hreflang 值,用来指定"当用户的语言/地区不匹配任何已声明版本时,应该展示哪个页面"。它常用于:
- 语言选择页:一个让用户自己选语言的入口页。
- 主要/默认语言版本:例如把英文版作为所有未覆盖用户的兜底。
比如你有中、英、日三版,一个说法语的用户来访——他不匹配任何一种,x-default 就决定他看到哪个。配置 x-default 不是强制的,但强烈推荐,能避免"未覆盖用户"被随机分配。
与 canonical 的配合#
hreflang 和 canonical 必须正确配合,否则会互相打架。核心规则只有一句:每个语言版本的 canonical 指向它自己,hreflang 列出所有版本。
<!-- canonical 指向自己,不是指向英文版 -->
<link rel="canonical" href="https://example.com/zh/page.html">
<!-- hreflang 列出全部版本(含自己) -->
<link rel="alternate" hreflang="zh" href="https://example.com/zh/page.html">
<link rel="alternate" hreflang="en" href="https://example.com/en/page.html">
常见错误#
| 错误 | 后果 | 修正 |
|---|---|---|
| 缺少返回链接(不双向) | 整组 hreflang 被忽略 | 确保每个版本互相声明 |
| 版本列表不含自身 | 关系不完整,可能失效 | 每页都包含自我引用 |
| 用相对 URL | 解析错误 | 必须用完整绝对 URL |
| 语言/地区代码写错 | 声明无效(如 en-UK、zh-CN 当简体) | 用 ISO 标准代码 |
| canonical 跨语言指向 | 非默认语言版本不被收录 | canonical 指向自身 |
| hreflang 指向 noindex/重定向页 | 关系无效 | 指向可索引的 200 页面 |
| 三种方式重复混用 | 冲突、维护混乱 | 只选一种实现方式 |
如何验证#
hreflang 配置复杂、易错,上线后务必验证:
- Google Search Console:早期有专门的"国际定位"报告;现在主要通过"网页"索引报告和实际搜索表现观察各语言版本的收录情况。
- 第三方校验工具:使用 hreflang 标签校验工具(如 Merkle hreflang Tags Testing Tool)批量检查返回链接是否完整、代码是否合法。
- 爬虫工具:Screaming Frog 等可抓取全站并报告 hreflang 的缺失返回链接、不一致和错误代码。
- 手动抽查:查看页面源码,确认每个版本的声明列表一致、含自身、URL 正确。
本站的多语言设计#
MagicSEO 目前只有中文版本,但从第一天起就为多语言做好了准备。
<link rel="canonical" href="https://magic-seo.com/articles/zh/technical-seo/hreflang.html">
<link rel="alternate" hreflang="zh-Hans" href="https://magic-seo.com/articles/zh/technical-seo/hreflang.html">
<link rel="alternate" hreflang="x-default" href="https://magic-seo.com/articles/zh/technical-seo/hreflang.html">
/articles/zh/...),zh 这一段就是为多语言预留的位置。当前每页用 zh-Hans 声明简体中文版,x-default 兜底也指向中文版自身,canonical 各自指向自身——这是单语言阶段的正确配置。未来加入英文版时,只需把页面放到 /articles/en/...,并在中英两版的 head 中各补一条互指的 hreflang,即可平滑升级为合规的双语 hreflang,无需改动现有 URL 结构。hreflang 配置清单#
- 仅在有多语言/多地区版本时配置
- 语言用 ISO 639-1,地区用 ISO 3166-1(大写)
- 简繁体用 zh-Hans / zh-Hant,而非 zh-CN 当简体
- 每个页面列出所有版本,且包含自身
- 所有版本互相声明(双向对应)
- 使用完整绝对 URL
- 配置 x-default 作为兜底
- 每个语言版本 canonical 指向自身
- 只选用一种实现方式,不混用
- 上线后用校验工具确认返回链接完整
常见问题#
hreflang 会影响排名吗?
hreflang 本身不是排名信号,它不会提升某个页面的排名。它的作用是让搜索引擎在搜索结果中为不同语言或地区的用户展示正确的版本,从而改善匹配度、点击率和用户体验,并减少不同语言版本之间的内容重复问题。换句话说,它优化的是"展示哪个版本",而不是"排名多高"。
只有一种语言的网站需要 hreflang 吗?
不需要。hreflang 仅在网站有多个语言或地区版本、且内容互为对应翻译时才有意义。如果你只有一种语言版本,不需要配置 hreflang。但建议在设计目录结构时就为多语言预留位置(如 /zh/、/en/),这样未来扩展语言版本时可以平滑加入 hreflang。
hreflang 和 canonical 冲突吗?
不冲突,但必须正确配合。每个语言版本的 canonical 应指向它自己,而不是指向其他语言版本。hreflang 负责声明这些页面互为语言替代版本,canonical 负责在每个语言内部去重。最常见的错误是把所有语言版本的 canonical 都指向某一种语言,这会导致其他语言版本不被独立收录。
x-default 是必须的吗?
不是强制的,但强烈推荐。x-default 用于指定当用户的语言/地区不匹配任何已声明版本时应展示的默认页面,常用于语言选择页或主要语言版本。配置 x-default 能为"其他所有未覆盖的用户"提供一个合理的兜底,避免他们被随机分配到不合适的版本。