指南

毁掉国际化 SEO 的十个 hreflang 错误

几乎所有出问题的 hreflang 配置,都能归到这十个错误上,而且多数是悄无声息地失效。本文讲清每一项该怎么识别、怎么纠正。

作者: WebDoctor 编辑部·2026年7月30日·2 分钟阅读


hreflang 的问题绝大多数可以归为十个错误:缺少回链、没有自引用、语言或地区代码不合法、使用相对 URL、指向非规范页面、缺少 x-default、混用多种实现方式、只覆盖一部分页面、备用版本被拦截,以及把 hreflang 当成重复内容的解药。每一项都有明确的症状和特定的修复办法。

hreflang 究竟做什么

hreflang 告诉搜索引擎,该给某位用户展示页面的哪个语言或地区版本。它只替换结果中的 URL,仅此而已。它不是排名加成。标注得再完美的页面,也仍然要靠自身实力去争取名次。

正确的 hreflang 集合长什么样

三个版本:英语、西班牙语,外加一个兜底版本,以 link 元素的形式写在这三个页面各自的 head 中:

<link rel="alternate" hreflang="en" href="https://example.com/page/">
<link rel="alternate" hreflang="es" href="https://example.com/es/pagina/">
<link rel="alternate" hreflang="x-default" href="https://example.com/page/">

同一组关系用 XML 站点地图表达时,urlset 必须声明 xhtml 命名空间:

<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
        xmlns:xhtml="http://www.w3.org/1999/xhtml">
  <url>
    <loc>https://example.com/page/</loc>
    <xhtml:link rel="alternate" hreflang="en" href="https://example.com/page/"/>
    <xhtml:link rel="alternate" hreflang="es" href="https://example.com/es/pagina/"/>
    <xhtml:link rel="alternate" hreflang="x-default" href="https://example.com/page/"/>
  </url>
</urlset>

西班牙语页面要带上完全相同的集合。这种对称性就是整个机制的全部,而下面大多数错误,都是在以各种方式破坏它。

1. 缺少回链

每一段 hreflang 关系都是双向的。如果 A 指向 B,B 就必须指回 A,否则这条标注无法确认,会被忽略。症状:结果中的版本从不切换,Search Console 报告缺少返回标记。修复:为该组中的每个页面都生成同样完整的集合,而不是一份单向清单。

2. 没有自引用的 hreflang

每个页面都必须包含指向自身 URL 的 hreflang 条目。漏掉它会让集合不完整,而搜索引擎会丢弃无法对齐的集合。修复:补上自引用,这样一个三语言分组在三个页面上各自都带三条条目。

3. 语言和地区代码写错

语言值必须是 ISO 639-1 代码,可选的地区必须是 ISO 3166-1 Alpha 2,而地区永远不能单独出现。三个经典错误:把 en-GB 写成 en-UK;混淆 zh-CN(中国的中文)与 zh-Hans(这是文字子标签,不是地区);以及用国家名生造语言,比如用 uk 指代英国,而它的实际含义是乌克兰语。不合法的值会被直接丢弃,不作任何提示。

4. 使用相对 URL

hreflang 的值必须是包含协议的完整绝对 URL。像 /es/pagina/ 这样的值不合法,该条目会被跳过。症状:标注在模板里看着没问题,却在任何地方都没登记生效。修复:每次都输出 https://example.com/es/pagina/,这与站点地图 loc 值适用的规则是同一条。

5. 指向非规范、发生跳转或带 noindex 的 URL

hreflang 和 canonical 必须彼此一致。每个页面的 canonical 指向自身,而每个 hreflang 值指向另一个版本的规范 URL。如果标注的 URL 会跳转、被规范到别处或带有 noindex,就等于发出了互相矛盾的指令,冲突的结果通常是你的标注被丢弃。修复:确保组内每个 URL 都返回 200、可被索引,并且自我规范。

6. 缺少 x-default 或用错 x-default

x-default 标记的是为你未覆盖语言的用户准备的兜底版本:一个语言选择页、一个全球落地页,或者你的主版本。症状:来自未覆盖地区的访客落在某个随意的版本上。修复:指定一个真正的兜底版本,并在整组页面中重复声明它。

7. 混用多种实现方式

hreflang 有三个合法的落点:head 中的 HTML link 元素、HTTP Link 响应头,以及 XML 站点地图中的 xhtml:link 标注。任选其一都可行。麻烦出在网站把其中两种都只做了一半,于是 head 里列了两种语言,站点地图里却列了四种。选定一种方式,并把它做完整。

8. 只标注首页

hreflang 是页面级信号,不是站点级设置。给首页打上标记,对它下面的 500 个产品页毫无作用。症状:每个市场看到的首页是对的,更深层的页面却是错误的语言。修复:为每个页面配上它真正的对应版本;如果某种语言没有对应版本,就把这门语言留空,而不是指向一个近似的页面。

9. 备用版本被拦截,无法抓取

只有两个页面都能被抓取,关系才算确认。在 robots.txt 中 disallow 某个语言目录,或者用会把爬虫弹走的地理跳转把它挡在门外,都会破坏回链校验。修复:让每个被标注的 URL 都可抓取、可直达,中间不经过跳转。

10. 指望 hreflang 解决重复内容

hreflang 管的是地区和语言变体。它不会对近乎相同的页面去重,也不能替代 canonical 标签。两个几乎一样的英语页面,一个面向美国、一个面向澳大利亚,仍然会互相竞争;hreflang 只说明每个页面是给哪个市场准备的。真正的重复内容需要做规范化或合并。

该选哪种实现方式

方式适合场景主要缺点
head 中的 HTML link 元素HTML 页面、语言数量不多、由模板驱动的网站标记量随语言数量的平方增长,而且每次页面加载都要带上
HTTP Link 响应头PDF 之类的非 HTML 文件,本来就没有 head 可改查看源代码看不见,需要服务器或 CDN 配置,迁移时容易丢失
XML 站点地图 xhtml:link大型网站和语言众多的场景;可以让页面标记保持精简不便抽查,而且站点地图必须始终有效且最新,否则整组标注都会过期

站点地图这条路扩展性最好,这也正是它容易悄悄失效的原因:命名空间写错或文件陈旧,都会连带把标注一起拖下水。生成器有任何改动之后,请验证站点地图,并用站点地图索引拆分体量较大的多语言集合。

如何检查 hreflang 是否生效

要双向检查。取回页面 A,读出它的标注集合,再逐个抓取它列出的 URL,确认每一个都列出了同样的集合,并且包含自身。查看源代码可以覆盖 HTML 方式,响应头覆盖第二种,站点地图覆盖第三种。任何不对称之处就是问题所在。

如果 Search Console 为你的资源提供国际定位报告,它会列出缺少返回标记、语言代码未知之类的 hreflang 错误,这是大规模发现问题最快的办法。它的数据滞后于你的部署,所以只应当作第二意见。至于底层的抓取层故障,站点地图错误指南讲了那些会让整组标注失效的跳转、404 和 robots.txt 拦截。

hreflang国际化 SEO

Frequently asked questions

如果网站只有一种语言,还需要 hreflang 吗?
不需要。单语言网站每个页面只有一个版本,没有可替换的对象。只有当你为不同语言或地区发布同样的内容,并希望搜索引擎给每类受众展示对应版本时,hreflang 才有价值。
en-UK 是合法的 hreflang 值吗?
不是。语言部分用 ISO 639-1,地区部分用 ISO 3166-1 Alpha 2,而英国的代码是 GB,所以应该写 en-GB。不合法的代码会被静默丢弃,标注在源代码里看着存在,实际却从不生效。
hreflang 能提升排名吗?
不能直接提升。它改变的是展示哪个 URL,而不是这个 URL 排得多好。不过间接收益是实在的:用户落在自己语言的版本上,跳出更少、转化更好,你也不再和自己的地区页面互相竞争。
不写 x-default 会怎样?
不会出故障。对于不在你所列地区之内的用户,搜索引擎会自行退回到它判断最接近的版本。加上 x-default 只是让你自己来做这个决定,把用户指向语言选择页或你的全球主页面,而不是听天由命。
同一个页面能同时用 hreflang 和 canonical 吗?
可以,而且应该这么做。每个版本的 canonical 指向自身,hreflang 则指向其他版本。错误做法是把所有语言版本都规范到同一个 URL,那等于告诉搜索引擎其他版本不该被索引,你的标注也就作废了。

立即检测

继续阅读