hreflang 是搜索引擎用以识别页面多语言版本的标签,必须严格遵循 BCP 47 规范、完整双向声明、使用绝对 URL、匹配 lang 属性且闭环验证有效,否则整组失效。

hreflang 不是“语言切换开关”,它只告诉搜索引擎:这个页面的其他语言版本在哪。配置错一条,整组可能被忽略。
hreflang 值必须严格符合 BCP 47 规范
写错大小写、连字符、下划线或用非标准码,Google 就当没这行。常见错误包括:zh_CN、EN-us、chinese、zh-ch、zh-Hant-TW-(多一个连字符)。
正确写法只有这些:
-
en-US(美式英语,语言小写 + 地区大写) -
zh-Hans(简体中文,注意是Hans不是hans) -
zh-Hant-HK(三段式合法,香港繁体) -
x-default(只能有一个,指向兜底页,如https://example.com/en/)
别信“差不多就行”——hreflang 解析器不宽容,错一个字符就失效。
立即学习“前端免费学习笔记(深入)”;
每个页面都得完整声明所有语言版本(含自己)
不是只在英文页写中文链接,中文页也得反向写英文链接;更关键的是,每页都要包含“自指”和“互指”。漏掉任意一个,整组 hreflang 可能被搜索引擎静默忽略。
比如你有三个版本:https://example.com/(en-US)、https://example.com/zh/(zh-CN)、https://example.com/ja/(ja-JP),那么每个页面的 <head> 都要放这三条:
<link rel="alternate" hreflang="en-US" href="https://example.com/"> <link rel="alternate" hreflang="zh-CN" href="https://example.com/zh/"> <link rel="alternate" hreflang="ja-JP" href="https://example.com/ja/">
别省略自己那条,也别漏掉 x-default。它不是替代项,而是兜底逻辑的一部分。
href 必须是绝对 URL,且协议一致
/zh/、./zh/、https://example.com/zh/?lang=zh 这些全无效。搜索引擎只认完整协议 + 域名 + 路径。
还要注意:
- HTTP 和 HTTPS 混用 = 断链,会被当成两个不同页面
- 带查询参数的 URL(如
?lang=zh)容易被误判为重复内容,Google 明确不推荐 - 子目录、子域名、不同域名必须一一对应,不能混用(比如 zh.example.com 页面却指向 example.com/zh/)
hreflang 和 lang 属性完全无关,别指望它自动改页面语言
加了 <link rel="alternate" hreflang="zh-CN">,页面不会自动切字体、不会调中文翻译脚本、也不会让浏览器用中文渲染。它只影响索引和流量分发。
真正控制渲染的是 <html lang="zh-CN"> —— 这个必须手动写死在每个语言页的根标签上,且值要和 hreflang 保持大小写、拼写完全一致(zh-CN ≠ zh-cn)。否则 Google 会判定矛盾,整组 hreflang 静默失效。
局部多语言内容(比如一段英文术语嵌在中文页里)也得显式加 lang="en",不能靠 JS 批量改 document.documentElement.lang 来覆盖已有 DOM。
最常被忽略的其实是闭环验证:每个 href 必须返回 200 状态码,且内容要实质性对应。哪怕一个链接 404,或某页漏掉反向声明,整个语言组都可能降权。别只看代码写了没,得用 Google Search Console 的「国际化报告」或 Screaming Frog 抓取比对。



















