多语言 hreflang 错误排查与修复清单

By huanggs

多语言站点出现“中文用户看到英文页”“德国用户进入奥地利页面”“搜索结果展示了错误地区版本”等情况时,hreflang 配置通常是第一批需要检查的技术项。hreflang 的作用不是提升某个页面的排名,而是帮助搜索引擎理解同一内容在不同语言或地区版本之间的对应关系,从而在合适的搜索场景中展示更合适的 URL。

本文按 Google Search Central hreflang guidelines 的规则整理排查方法:语言代码可以单独使用,例如 de;带地区时通常写作 de-DE、en-GB 这类语言加地区的组合;备用 URL 必须是包含 http 或 https 的完整 URL;x-default 是给未匹配语言或地区用户使用的默认候选页面,并不是所有页面都强制必须添加的标签。

先判断:你的页面是否真的需要 hreflang

并不是所有有外语内容的站点都需要复杂的 hreflang 矩阵。建议先按页面级别判断:

  • 需要配置:同一主题存在多个语言版本,例如英文、德文、日文页面;或同一语言存在不同地区版本,例如 en-US 与 en-GB。
  • 通常不需要配置:只有一个语言版本,且没有对应替代页面;或者只是页面中包含少量外语词汇,并不存在独立的本地化 URL。
  • 需要谨慎配置:页面内容差异很大,不是互为替代版本。此时不要为了“覆盖地区”强行互相声明 hreflang。

正确写法:完整 URL、语言代码和自引用

在 HTML 的 <head> 中,常见写法如下。注意 href 使用完整 URL,而不是 /de/ 这样的相对路径:

<link rel="alternate" hreflang="en" href="https://www.example.com/en/" />
<link rel="alternate" hreflang="de" href="https://www.example.com/de/" />
<link rel="alternate" hreflang="fr" href="https://www.example.com/fr/" />
<link rel="alternate" hreflang="x-default" href="https://www.example.com/" />

如果页面面向特定地区,可以使用语言加地区的形式:

<link rel="alternate" hreflang="en-US" href="https://www.example.com/us/" />
<link rel="alternate" hreflang="en-GB" href="https://www.example.com/uk/" />
<link rel="alternate" hreflang="de-DE" href="https://www.example.com/de/" />

实际维护时,建议每个语言或地区版本都包含自引用标签。例如英文页面不仅要指向德文、法文页面,也应声明自己是英文版本。这样可以让整组替代页面关系更清晰。

最常见的 6 类 hreflang 错误

错误类型 表现 修复方式
使用相对 URL href="/de/" 改为 https://www.example.com/de/ 这类完整 URL。
返回链接缺失 A 页面指向 B 页面,但 B 页面没有指回 A 页面。 让互为替代版本的页面形成双向声明;如果某些语言版本暂时缺失,至少保证已有成对页面互相指向。
语言或地区代码不准确 把英国地区代码写成 en-UK、只写国家码 UK,或把中文写成 zh_CN 这类下划线格式。 按 Google 文档使用有效语言/地区格式:语言可单独使用,如 en;地区需作为第二段并用连字符,如 en-GB、en-US;中文可按需要使用 zh-Hans、zh-Hant 或带地区的合法组合。
指向不可访问页面 hreflang 指向 404、重定向链、被 noindex 的页面。 只指向可抓取、可索引、状态码正常的替代页面。
canonical 与 hreflang 冲突 德文页面 canonical 到英文页面,同时又声明自己是德文替代页。 通常让每个本地化页面 canonical 到自身,除非你明确不希望该版本被索引。
把 x-default 当成必填项 所有页面机械添加默认页,甚至默认页与用户意图无关。 只有在存在语言选择页、全球首页或合理兜底页时再使用 x-default。

排查步骤:从单页到整站

如果你正在为多语言 hreflang 错误而头疼,可以按下面顺序做技术审计,避免一开始就陷入全站级别的复杂表格。

  1. 抽取一个页面组:选择同一内容的全部语言或地区版本,例如 /en/product-a/、/de/product-a/、/fr/product-a/。
  2. 读取每个页面的 hreflang:检查页面源代码、HTTP header 或 XML sitemap 中是否存在 hreflang 声明。三种方式可以使用其一,但不要让不同位置输出互相矛盾的版本关系。
  3. 核对 URL:确认每个 href 都是完整 URL,协议、域名、路径、结尾斜杠规则与实际可访问地址一致。
  4. 核对语言与地区:确认 hreflang 值与页面内容一致。只针对语言时可用 de、fr;针对国家或地区版本时再使用 de-DE、fr-CA 等。
  5. 检查双向关系:如果英文页声明德文页是替代版本,德文页也应声明英文页。缺少互相指向时,相关注解可能不会被采用。
  6. 检查索引状态:不要把 hreflang 指向被 noindex、robots 阻止、返回 404 或长期 301/302 跳转的 URL。
  7. 检查 canonical:本地化页面若希望被搜索引擎作为独立版本理解,canonical 通常应指向自身,而不是统一指向主语言页面。

大型站点如何降低维护错误

当语言和地区版本增加时,手动维护很容易出错。更稳妥的方式是先建立一张“页面映射表”,再由模板或 sitemap 自动输出。映射表至少应包含这些字段:

  • content_id:同一内容组的唯一编号,例如 product-a。
  • locale:页面目标语言或地区,例如 en、en-GB、zh-CN。
  • url:该版本的完整规范 URL。
  • indexable:是否允许索引,只有可索引页面才应进入 hreflang 输出。
  • canonical_url:用于检查是否与当前本地化 URL 冲突。
  • last_checked:最近一次抓取或校验时间,方便定位上线后变更。

有了这张表后,每个 content_id 下的可索引 URL 可以自动组成一组 hreflang。新增语言版本时,只需补齐映射表,而不是逐页手工复制标签。

上线前检查清单

  • 每组替代页面是否都指向完整 URL,而非相对路径。
  • 语言代码是否与页面正文语言一致;地区代码是否确有业务和内容差异支撑。
  • 互为替代版本的页面是否具备双向声明。
  • hreflang 目标页是否返回 200,且未被 noindex 或 robots 规则阻止。
  • canonical 是否没有把本地化页面统一合并到其他语言版本。
  • x-default 是否指向合理的全球首页、语言选择页或默认页面,而不是机械添加。
  • HTML、HTTP header、XML sitemap 中的 hreflang 信号是否一致,避免同一页面在不同位置声明不同替代关系。

修复 hreflang 的关键不是堆叠更多标签,而是保证每个页面组的关系真实、完整、可抓取且不互相矛盾。先用少量核心页面组验证规则,再扩展到模板和 sitemap,通常比一次性全站修改更安全。