Hreflang标签实战指南:多语言网站SEO优化关键技巧

上官鑫钰 优化 阅读 2,825
赞 14 收藏
二维码
手机扫码查看
反馈

我的写法,亲测靠谱

做国际化项目这几年,hreflang 这个东西我踩过不少坑。一开始以为就是加几个 link 标签完事,结果上线后 Google Search Console 报一堆错误,流量还掉得莫名其妙。折腾几次之后,现在我基本固定了一套写法,稳定跑在几个多语言站点上,没再出过大问题。

Hreflang标签实战指南:多语言网站SEO优化关键技巧

我现在的做法是:在每个页面的 <head> 里,明确列出当前页面对应的所有语言版本,包括自己。比如一个英文页面,它要同时声明自己是 en,也要告诉搜索引擎还有 fr、es、zh 等版本存在。

代码长这样:

<link rel="alternate" hreflang="en" href="https://jztheme.com/en/page" />
<link rel="alternate" hreflang="fr" href="https://jztheme.com/fr/page" />
<link rel="alternate" hreflang="es" href="https://jztheme.com/es/page" />
<link rel="alternate" hreflang="zh" href="https://jztheme.com/zh/page" />

关键点来了:每个页面都要包含完整的 hreflang 集合,不能只写“其他语言”,漏掉自己。很多人图省事,只在非默认语言页面加 hreflang,结果 Google 直接报“未双向链接”(missing reciprocal links)—— 因为英文页说有法文版,但法文页没说有英文版,这就对不上了。

另外,我强烈建议加上 x-default。这个不是必须的,但在用户语言不匹配时,Google 会用它作为 fallback。我一般把它指向主语言(通常是英文):

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

这么写的好处是:结构清晰、自洽、容易维护。虽然看起来重复代码多,但用模板或组件一处理,其实没多少工作量。

这几种错误写法,别再踩坑了

下面这些错误,我在不同项目里都见过,有的还是自己亲手写的(笑)。列出来给大家避雷。

  • 只写其他语言,漏掉当前页面:比如在 /fr/page 页面里只写了 en 和 es,没写 fr 自己。Google 会认为这个页面没有声明自己的语言,直接忽略整个 hreflang 块。
  • hreflang 值格式错误:有人写成 en-US,有人写成 EN_us,还有人混用大小写。正确格式是:语言小写 + 地区大写,中间连字符,比如 en-USzh-CN。但如果你不需要区分地区(比如全球英文站),就直接用 en,别画蛇添足。
  • href 指向不存在的页面:最离谱的一次,我们有个德语页的 hreflang 指向了 /de/page,但那个页面根本没上线,404。结果 Google 把整个语言组都降权了。上线前一定要跑一遍链接校验。
  • 用了相对路径:写成 href="/fr/page" rel="external nofollow" 看似没问题,但某些 CDN 或 SSR 渲染环境下可能解析错。我吃过一次亏,后来全部改成绝对 URL,一劳永逸。
  • 多个 x-default 冲突:同一个页面里别放两个 x-default,更别在不同页面里让 x-default 指向不同主站。这会让搜索引擎懵圈。

还有一种隐蔽错误:hreflang 和页面实际内容语言不一致。比如页面 HTML 的 <html lang="fr">,但 hreflang 却标的是 en。这种虽然不会报错,但会影响 SEO 判断。我建议把这两处语言标识统一起来,最好从同一个配置源读取。

实际项目中的坑

真实项目里,hreflang 最头疼的不是写法,而是数据同步。比如你有 10 个语言,每个页面都要生成 10 条 link 标签。如果某个语言临时下线了(比如日语站暂停),你是不是要把所有页面里的 ja 版本都删掉?

我之前偷懒,写了个硬编码数组:

const locales = ['en', 'fr', 'es', 'zh'];

结果某天产品经理说“德语站下周上线”,我得全局改这个数组,还得确保每个页面渲染时都拿到最新列表。后来改成从 CMS 接口动态拉取可用语言列表,虽然多了一次请求,但维护成本低多了。

另一个坑是动态路由。比如博客文章路径是 /en/blog/:slug,那对应的法语版应该是 /fr/blog/:slug。这里要注意 slug 是否跨语言一致。有些团队会为每种语言生成不同的 slug(比如英文用 “how-to-optimize-seo”,中文用 “seo优化指南”),这时候 hreflang 的 href 就不能简单替换前缀,得查数据库映射关系。

我现在的方案是:在内容模型里给每篇文章加一个 translations 字段,存所有语言版本的完整 URL。渲染时直接遍历这个字段生成 hreflang,避免路径拼接出错。

还有个小细节:别忘了 canonical 标签。很多人以为加了 hreflang 就不用管 canonical 了,其实不是。每个语言版本应该有自己的 canonical,指向自己(除非有重复内容问题)。比如 /en/page 的 canonical 应该是自己,而不是 /fr/page。

最后提醒一句:Google Search Console 的 International Targeting 报告一定要定期看。它会明确告诉你哪些页面 hreflang 有问题,比如“no return tag”或者“invalid hreflang”。我每周都会扫一眼,比等流量掉了再排查强多了。

结尾:简单但别偷懒

hreflang 本身不复杂,但细节特别多。我的经验是:宁可多写几行代码,也别图省事搞“智能推断”。明确、完整、一致,这三个原则做到了,基本就不会出大问题。

以上是我踩坑后的总结,希望对你有帮助。如果你有更好的方案——比如用 HTTP header 实现 hreflang(虽然我不推荐,维护太麻烦),或者自动化校验工具,欢迎评论区交流。

本文章不代表JZTHEME立场,仅为作者个人观点 / 研究心得 / 经验分享,旨在交流探讨,供读者参考。
发表评论

暂无评论