< BACK 一张破旧的纸质世界地图放在桌子上,旁边放着铅笔和咖啡杯,用温暖的黄金时段光线和胶片颗粒拍摄

hreflang 标签做得对:大规模避免错误

2021 年,我从一个客户那里接手了一个 14,000 页的电商网站,他们之前的代理机构已经"完成了国际 SEO"。审计三周后,我在 Google Search Console 中发现了 31,000 个 hreflang 错误。三万一千个。这个网站有七个语言版本,每一个页面都缺少自引用标签。德语页面指向法语 URL。x-default 指向一个完全指向其他地方的 301 重定向 URL。来自非英文市场的自然流量已经停滞了八个月,没有人把这些点连起来。

那个项目可能是我现在将 hreflang 实现视为一流工程问题而不是翻译冲刺中匆匆添加的事后考虑的最大原因。

那么让我们好好深入讨论一下。

---

hreflang 实际上做什么(以及它不做什么)

我会简短地说明,因为大多数人已经大致了解了。hreflang 是一个 HTML 属性(或 HTTP 标头,或 XML 网站地图条目),它告诉 Google 一个页面的哪个版本对应哪个语言和地区组合。它不会直接改变排名。它改变的是 Google 向哪个国家的哪个用户显示哪个 URL。which URL Google shows to which user in which country.

就是这样。这是一个信号,不是指令。如果实现有问题或相互矛盾,Google 可以忽略它。而且它确实会这样做。经常会。

它不做的事:它不会阻止用户访问错误的地区版本,它不会替代你的内容策略,它绝对不会为那些只是机器翻译副本且没有本地化努力的内容不足页面进行补偿。not do: it doesn't block users from accessing the wrong regional version, it doesn't replace your content strategy, and it absolutely doesn't compensate for thin translated pages that are just machine-translated copies with no localisation effort.

在看其他任何资源之前,值得先读一下 Google 自己的 hreflang 文档。它的文风枯燥如陈面包,但准确无误。Google's own hreflang documentation before anything else. It's drier than a stale biscuit but it's accurate.

---

我在几乎每次审计中都看到的五个错误

缺少自引用标签

这是最关键的一个。hreflang 集群中的每个页面都必须包含指向自身的标签。不仅仅是其他变体。还要指向自己。

如果你的英文页面位于 example.com/en/product/,它有指向 /de/product/ 和 /fr/product/ 的标签,但忘记了指回 /en/product/ 的 hreflang="en",整个集群在技术上就是无效的。Google 不一定会抛出硬错误,但它会降低对整个信号集的信心。example.com/en/product/ has tags pointing to /de/product/ and /fr/product/ but forgets the hreflang="en" pointing back to /en/product/, the whole cluster is technically invalid. Google won't necessarily throw a hard error but it will reduce its confidence in the entire signal set.

我见过开发者犯这个错误,他们读过一篇博客文章,看到一个只有两个变体的例子,但因为那个例子写得不好,他们没有注意到自引用标签。我就不点名了。

返回标签缺失或损坏

hreflang 是双向关系。如果你的英文页面指向德文页面,德文页面必须指回英文页面。缺少返回标签,Google 就会看到握手失败。

在我提到的 2021 年项目中,开发者只在英文模板中添加了 hreflang。德文、法文和西班牙文模板完全没有 hreflang。所以 Google 收到的是半段对话,明智地忽略了所有内容。

语言代码错误

使用 BCP 47 语言标签。这意味着 en 表示通用英文,en-GB 表示英式英文,en-US 表示美式英文。不要用 en_GB、english 或 ENG。BCP 47 language tags. That means en for English generically, en-GB for British English, en-US for American English. Not en_GB . Not english . Not ENG.

我在去年 Seahawk 审计的一家金融科技网站上发现了 lang="english-uk"。开发者显然是猜测的格式。它已经上线 14 个月了。lang="english-uk" on a fintech site we audited at Seahawk last year. The developer had clearly just guessed the format. It had been live for 14 months.

x-default 缺失或错误

x-default 应该指向一个页面,用来处理语言或地区与你的其他变体都不匹配的用户。通常是你的首页或语言选择页面。它不只是"英文版本"的同义词。我见过 x-default 指向返回 404 的 URL、指向重定向链,还有一次指向测试环境。 should point to a page that handles users whose language or region doesn't match any of your other variants. Usually your homepage or a language-selection page. It is not just a synonym for "English version". I've seen x-default pointing at a URL that returns a 404, pointing at a redirect chain, and once, memorably, pointing at a staging environment.

如果你没有合理的备选页面,实际上不添加 x-default 比错误使用它更好。但通常你应该有一个。

错误地同时使用 Canonical 和 hreflang

你的规范标签(canonical tag)和 hreflang 标签不能相互矛盾。如果 /en-gb/page/ 的规范标签指向 /en/page/,但同时 hreflang 声明自己为 en-GB,你就制造了一个信号冲突。规范标签实际上是在说"我不是这个 URL 的首选版本",而 hreflang 则在说"我是英国英语用户的首选版本"。Google 必须选择一种解释,而它通常两者都不选。/en-gb/page/ has a canonical pointing to /en/page/, but also has hreflang declaring itself as en-GB, you've created a signal conflict. The canonical is effectively saying "I'm not the preferred version of this URL" while hreflang is saying "I am the preferred version for British English users". Google has to pick one interpretation and it often picks neither.

---

如何在大型网站上实施而不失去理智

模板级别 vs. 页面级别

在一个有 50 个页面的网站上,你可以手工制作每个 hreflang 标签。在一个有 5,000 个页面的网站上,你不能。你需要以程序方式生成它们。

我找到的最干净的方法是在结构化数据源(数据库表,或者对于较小项目甚至可以是平面 JSON 文件)中存储你的 URL 映射,然后在渲染时生成标签。在 WordPress 中,Yoast SEO 和 Rank Math 都对标准设置处理得相当不错,但当你的 URL 结构在不同语言间差异很大,而不是遵循可预测的 /en/、/de/、/fr/ 前缀模式时,两者都无法处理。/en/, /de/, /fr/ prefix pattern.

如果你的 URL 不统一(比如说,翻译的 slug 像 example.com/en/running-shoes/ 和 example.com/de/laufschuhe/),你需要一个显式的映射表。没有任何插件能自动搞清楚这一点。我在 2022 年一个运动服装客户的项目上以昂贵的方式学到了这一点,他们的翻译 slug 与英文版本完全独立。example.com/en/running-shoes/ and example.com/de/laufschuhe/), you need an explicit mapping table. No plugin will figure that out automatically. I learned this the expensive way on a sportswear client in 2022 whose translated slugs were completely independent of the English ones.

XML 网站地图方法

对于非常大的网站,我更倾向于使用 XML 网站地图方法而不是内联 HTML 标签。它保持 <head> 清洁,更容易以程序方式审核,而且你可以更新网站地图而无需修改页面模板。<head> clean, it's easier to audit programmatically, and you can update the sitemap without touching page templates.

格式看起来像这样(概念上,没有代码围栏):每个 <url> 块包含多个 <xhtml:link> 条目,每种语言变体各一个,包括自引用的那个。xmlns:xhtml 命名空间声明必须在 <urlset> 元素中存在,否则整个东西会无声地崩溃。<url> block contains multiple <xhtml:link> entries, one per language variant including the self-referencing one. The xmlns:xhtml namespace declaration must be present in the <urlset> element or the whole thing breaks silently.

一个需要注意的问题是:网站地图方法只有在Google最近爬取并索引了你的网站地图时才有效。如果你的大型网站存在爬虫预算问题,HTML方法更可靠,因为Googlebot在爬取每个页面时会内联读取标签。

针对非HTML内容的HTTP头

有PDF文件或其他非HTML文件需要使用hreflang?使用HTTP头。你的服务器返回带有rel="alternate"和hreflang属性的Link头。这在实践中很少见,但我见过大型法律和金融网站拥有数千份多语言PDF文档,在这些情况下这实际上很重要。Link header with rel="alternate" and hreflang attributes. This is rare in practice but I've seen large legal and financial sites with thousands of multi-language PDF documents where this actually matters.

---

真正有帮助的工具

我这些年用过很多工具。以下是我真正经常使用的:

  • Screaming Frog SEO Spider:运行爬取,转到hreflang选项卡。它会在一个地方标记出缺失的返回标签、缺失的自引用、损坏的URL和无效的语言代码。这是我进行每次国际化审计的第一站。按£199/年的价格,这是我所知最具性价比的技术SEO工具。: Run a crawl, go to the hreflang tab. It will flag missing return tags, missing self-references, broken URLs, and invalid language codes all in one place. This is my first stop on every international audit. At £199/year it's the best-value technical SEO tool I know.
  • Ahrefs Site Audit:很好的次要检查,特别是如果你想在同一平台中与有机流量数据交叉参考。: Good secondary check, especially if you want to cross-reference with organic traffic data in the same platform.
  • hreflang标签测试工具(由Merkle提供):免费,访问https://www.merkle.com/en/merkle-labs/hreflang-testing-tool.html。粘贴一个URL,它会检查整个集群。非常适合在修复过程中对特定页面进行现场检查。: Free, at https://www.merkle.com/en/merkle-labs/hreflang-testing-tool.html. Paste a URL, it checks the entire cluster. Brilliant for spot-checking specific pages mid-fix.
  • Google Search Console:Legacy Tools(旧版工具)下的国际化定位报告。更新速度较慢,但它是Google如何实际读取你的实现的最终真相来源。: The International Targeting report under Legacy Tools. Slow to update but it's the ground truth for how Google is actually reading your implementation.
  • Sitebulb:如果你偏好视觉化爬虫工具且希望报告更容易上手,Sitebulb在可视化hreflang集群关系方面做得很不错。: If you prefer a visual crawler with more beginner-friendly reporting, Sitebulb does a solid job of visualising hreflang cluster relationships.

我不用的工具:那些hreflang生成器工具,它们为你生成静态标签块供复制粘贴。这些工具对学习语法还行。但超过20个页面就没用了,因为你还得手动维护。

---

大规模审计:一个行之有效的流程

这是我在200多个多语言网站上不断完善的实际步骤,我在每次国际审计中都会运用:

  1. 用Screaming Frog爬取网站,如果网站使用JS框架,确保打开JavaScript渲染。
  2. 将hreflang数据导出到电子表格。按目标集群对URL进行分组。
  3. 检查每个集群是否有:自引用标签、所有变体的返回标签、有效的BCP 47代码、规范链接的一致性。
  4. 检查x-default URL的200状态码。不是301。是200。
  5. 与你的XML网站地图交叉验证(如果你使用网站地图方法)。网站地图中的每个URL都应该返回200。
  6. 通过 Merkle 测试工具运行 20-30 个页面的样本,验证 Google 是否真的在读取你认为它读取的内容。
  7. 从 Search Console 中提取国际定位报告,特别查找"无返回标签"错误。这几乎总是模板在添加新语言时未更新的症状。
  8. 修复,2 周后重新爬取,验证 Search Console 中的错误数量是否有所下降(Search Console 数据可能需要 4-6 周才能完全反映修复)。

这不是一次性的流程。把定期爬取加入你的日历,每季度执行一次。国际网站在不断变化。新页面被添加,旧页面被重定向,当没人关注时,hreflang 集群会无声地崩溃。

---

何时不使用 hreflang

大多数指南都会跳过这一点,这让我很生气。

如果你只有一种语言但多个地区(比如英国和澳大利亚都用英语),hreflang 是值得使用的,但前提是内容的差异足够大,能够为这些用户提供不同的服务。如果你的英国和澳大利亚页面 95% 相同,你可能会造成比清晰还多的混淆。Google 可能会选择在全球范围内显示一个变体,你的 hreflang 信号很可能会被基本上忽略。

如果你来自国际市场的流量很少,花一周时间实施 hreflang 可能不是时间的最佳用途。一个结构良好的 URL 层级加上 <html lang=""> 属性和 Search Console 中的地理定位设置将足以覆盖你的需求,直到流量量足以证明完整实施的必要性。<html lang=""> attributes and geotargeting settings in Search Console will cover you adequately until the traffic volume justifies a full implementation.

如果你的网站是一个单页应用,内容动态加载,先把渲染方面做对。我见过 hreflang 在静态 HTML shell 中实施得完美无缺,而实际页面内容是 JavaScript 渲染的,Googlebot 看到的只是一个加载中的旋转图标。在担心国际化信号之前,先解决可索引性问题。

---

常见问题

hreflang 标签是否直接影响排名?

不影响。hreflang 信号告诉 Google 应该为哪个用户提供哪个 URL,而不是如何排名该 URL。间接地,让合适的页面展现在合适的用户面前可以减少用户的返回跳转,改善参与度指标,这可能会对排名产生下游影响。但添加 hreflang 标签本身不会直接提升排名。

Google 处理 hreflang 更改需要多长时间?

通常需要 4-8 周才能在 Search Console 数据中完全反映更改。爬虫频率很重要。对于爬虫速率较慢的大型网站,可能需要长达 12 周。不要做出更改后第二天就检查结果,那样会让你发疯。

我可以在 Shopify 商店中使用 hreflang 吗?

可以,但如果你使用子文件夹或子域,Shopify 的原生国际化功能(通过 Markets)已经为你处理了很多工作。如果你为不同区域使用单独的商店,你需要通过主题自定义或应用程序手动实施 hreflang。我在这里以 Shopify 自己的国际 SEO 指南作为起点。它相当完整。Shopify's own international SEO guidance as a starting point here. It's reasonably complete.

语言定位和国家定位之间有什么区别?

语言定位(例如 hreflang="es")表示:无论用户身在何处,都向西班牙语使用者展示此内容。国家定位(例如 hreflang="es-MX")表示:仅向墨西哥的西班牙语使用者展示此内容。当你的内容对所有该语言使用者都相同时,使用纯语言标签。当定价、货币或重要内容因地区而异时,使用语言-国家标签。hreflang="es") says: show this to Spanish speakers regardless of where they are. Country targeting (e.g., hreflang="es-MX") says: show this to Spanish speakers in Mexico specifically. Use language-only tags when your content is the same for all speakers of that language. Use language-country tags when pricing, currency, or significant content differs by region.

我的 hreflang 错误在修复后反而增加了。为什么?

通常是因为修复某些标签让 Google 更积极地爬取你的页面,现在它发现了之前未报告的错误。这是报告现象,不是说明修复让情况更糟。继续进行,4 周后重新爬取。

---

Hreflang 真的是那种把它做到 90% 正确几乎和做到 0% 正确一样糟糕的东西。破损的信号会产生噪音,Google 会学会不信任这些噪音。花时间把它做好,定期审计,把它当作基础设施来对待。你的国际自然流量会无言地感谢你,这是最好的感谢方式。

< BACK