如果你跑一个双语站,hreflang 决定了 Google 是把你的中文页面排进中文搜索结果,还是把中英两版当成互相竞争的重复内容。它就十来行 HTML,可大约一半的多语言站都有微妙的错。Google 自己的数据和主流审计工具都认同:用了 hreflang 的站里超过 60% 至少有一处错——而且因为 Google 把 hreflang 当作「提示」而非「指令」,配置坏了就直接被忽略,Search Console 里连个警告都没有。
一句话结论
每页 <head> 里放一组互相引用的 <link rel="alternate" hreflang="...">。中英两版的文章就是三条:英文 URL、中文 URL、加一个 x-default。每页都必须列出自己 + 所有其他语言版本,而且两边要互相指向对方——单向 hreflang 会被整组丢弃。URL 一律用绝对路径 https://,并和 canonical、sitemap 一字不差地对齐。
hreflang 到底管什么、不管什么
hreflang 是在告诉搜索引擎「这份内容有 X 语言在 URL A、Y 语言在 URL B」。Google 拿它做两件事:
- 在搜索结果里给对的用户展示对的语言版本。
- 把你的各语言版本聚成一簇,不让它们被当成互相竞争的重复内容。
它不直接提升排名,而且只是个 Google 可以推翻的提示。但双语站上 hreflang 缺失或写错,通常会把非默认语言的流量打残——因为 Google 会把英文页推给中文搜索者(人家直接跳出),或者干脆每一对里只收录一个版本。
哪些迹象说明 hreflang 坏了
- 中英两版文章在并行 URL 上(
/en/articles/x/和/zh/articles/x/),但 Google 中文结果里出现的是英文页,或反过来。 - Search Console 对某个语言版本显示「Alternate page with proper canonical tag」(这条通常没问题,见 FAQ)。
- Screaming Frog、Ahrefs 之类爬虫在你的 hreflang 对上报「Missing return tags」/「no return-tag」。
- 「网页(Pages)」报告里中文收录数远低于英文,尽管两边完整度一样。
标签到底长什么样
一篇英文(默认)+ 中文的文章,每一页都带同一组三条标签。英文页和中文页的 <head> 里都放:
<link rel="alternate" hreflang="en" href="https://yoursite.com/en/articles/slug/" />
<link rel="alternate" hreflang="zh" href="https://yoursite.com/zh/articles/slug/" />
<link rel="alternate" hreflang="x-default" href="https://yoursite.com/en/articles/slug/" />
三条铁律决定这组标签成败:
- 自指。 每页都要列出自己 URL 对应自己语言值的那一条。Google 文档原话:「每个语言版本必须列出自身以及所有其他语言版本。」漏了自指标签,Google 可能就当这组不完整。
- 互指。 英文页指向中文 URL,中文页也要指回英文 URL。Google:「如果两页没有互相指向,标签会被忽略。」这是最常见的翻车点。
- 完全限定的 URL。 用
https://yoursite.com/zh/articles/slug/,绝不要//yoursite.com/...或/zh/...。协议、主机、大小写、结尾斜杠都必须和你的 canonical、sitemap 完全一致——少一个结尾斜杠都算不匹配。
canonical 和 hreflang 是两件事
每个语言版本都用自指 canonical。不要为了「集中权重」把中文页 canonical 到英文页(或反过来)——那会让你的中文页从中文搜索消失,正好南辕北辙。两个标签是配合干活:canonical 说「这是这份内容这门语言的标准 URL」,hreflang 说「这里还有其他语言版本」。
语言代码怎么选
除非你真的为不同地区出不同内容,否则用只标语言的代码(hreflang="zh")。如果你的区别是简体 vs 繁体的字形——中文最常见的情况——技术上正确的是 ISO 15924 字形子标签 zh-Hans(简体)和 zh-Hant(繁体),而不是国家代码 zh-CN/zh-TW。国家代码把字形和地理混为一谈(比如新加坡也用简体),zh-Hans/zh-Hant 才精准命中真正的差异。只有当你确实出地区专属内容时,再加地区码(zh-Hans-CN、en-GB),因为地区码意味着你承诺维护那个变体。
标签放哪:head、sitemap 还是 HTTP 头
| 方式 | 适合 | 取舍 |
|---|---|---|
<head> 里的 <link> | 大多数站;最好调试(view-source 直接能看到) | 每页都要加这段标记 |
XML sitemap(xhtml:link) | 上百页;保持 HTML 干净 | 不好肉眼核对;每个 <url> 都要列全部备选 |
HTTP Link: 响应头 | 非 HTML 文件(PDF)或靠头驱动的 CDN | 最难检查和维护 |
每个 URL 只用一种方式。Google 文档说得清楚:你可以三种一起上,但「在搜索里没有好处(反而可能难管得多)」。对典型的中英双语 Astro / Next / Hugo 站,<head> 标签就是默认正确选项。
怎么验证它真的生效(2026 版做法)
提个醒:Search Console 的 International Targeting(国际定位)报告已在 2022 年 9 月下线,所以那个会列 hreflang 错误的旧「语言」标签页不存在了。改用这套:
- View source 看一篇英文页,确认三条 hreflang;再打开对应中文页,确认是同样三条。两边标签块不一致是头号 bug。
- 用 爬虫 跑全站——Screaming Frog(500 个 URL 内免费)或 Ahrefs / Semrush 的 Site Audit——看专门的 hreflang 报告里有没有「Missing return tags」「Non-canonical」「Inconsistent」之类标记。
- 在 Search Console 用 URL Inspection 逐条抽查——它已经不给你 hreflang 面板了,但能确认页面已收录,并显示 Google 选定的 canonical,按理应该就是该页自己(每种语言各自)。
- 每 3~6 个月以及任何一次域名、URL 结构、CMS 变动后都重新审计一遍,因为这类错误在掉流量之前是看不见的。
容易踩的坑
- 单向 hreflang。 英文页引用了中文,中文页没引用回来。Google 默默把整组丢掉。
- 漏了自指。 每页必须包含自己 URL 对应自己 hreflang 值那一条,否则 Google 认为这组不完整。
- 把一种语言 canonical 到另一种。 会让非 canonical 的那门语言从搜索里消失。千万别做。
- 通用内容却用地区码。 如果
zh-CN和zh-TW出的是同一份页面,你根本没有地区专属内容——用zh(或按字形用zh-Hans/zh-Hant)。 - URL 漂移。 hreflang、canonical、sitemap 之间差一个结尾斜杠、
httpvshttps、或大小写不同,都会让匹配失败。
这篇适合谁 / 什么时候别看
适合同一域名下跑并行中英两版(或任意双语组合)、slug 一一对应的独立内容站。如果你是单语站,完全跳过——hreflang 对你没意义。如果两个语言版本差异巨大(文章不同、结构不同),别硬上 hreflang,按两个独立属性来跑。
FAQ
- 一定要有
x-default吗?: 强烈建议有。x-default是 Google 在「没有其他语言/地区匹配用户浏览器设置时」拿来兜底的版本。没它,Google 会替第三国用户猜,而且经常猜错。 - hreflang 能放 sitemap 里而不是
<head>吗?: 能。三种方式(head 标签、XML sitemap、HTTP 头)一样有效,但每个 URL 只用一种——Google 说同时用没有搜索上的好处,还更难管。页面多的站用 sitemap 版能让 HTML 干净;<head>版更好调试。 - Search Console 还显示「Alternate page with proper canonical tag」是咋回事?: 对非默认语言版本来说,这就是正确、应有的状态——意思是 Google 看到了这页,把它当成 canonical 页的备选语言版本,不是错误。只有当你的主语言页面也显示这个时才要担心。
- 该用
zh、zh-CN还是zh-Hans?: 只出一个中文版本就用zh。如果简体、繁体分开出,用字形子标签zh-Hans/zh-Hant——它命中真正的差异(字形),而不是从国家去猜。zh-CN/zh-TW留给真正的地区专属内容。 - hreflang 能帮我在百度排名吗?: 不能。百度不用
hreflang。百度需要百度站长平台 + ICP 备案,是另一套流程。hreflang只对 Google 和 Bing 有用。