站点运营

站点运营:多语言与多地区版本自查,别让版本关系写成糊涂账

多语言、多地区站点如果版本关系没标注清楚,同一篇内容可能被拆成几个互相竞争的页面。本文从是否需要多版本讲起,梳理 hreflang 的互指、自引用、语言代码、x-default 等基本规则,并给出可直接对照的自查清单,以及和 canonical、站点地图配合时容易踩的坑。

站点运营

站点运营:多语言与多地区版本自查,别让版本关系写成糊涂账

先确认是否真的需要多版本

有些站点只是在页面上放了一个中英切换按钮,实际内容却是同一份机器翻译,连标题都几乎一样。这种情况做 hreflang 意义不大,反而容易让搜索引擎在两份相似页面之间犹豫。判断标准很简单:不同版本是否面向不同语言或地区的用户,内容是否真的做了本地化处理。如果两个版本只是换了个域名、正文完全一致,优先考虑合并成一个页面,而不是硬拆成多版本。

hreflang 的四条基本规则

  • 必须互指:A 版本指向 B 版本,B 版本也要指回 A 版本,只写一边等于没写。
  • 必须自引用:每个版本都要把自己也列进清单里,中文版本同样不能漏。
  • 语言代码要写对:zh-Hans、zh-Hant、en、en-US 这类写法不能凭感觉拼,语言与地区之间用连字符,不要用下划线,也不要写成 zh-CN 以外自造的组合。
  • URL 用绝对地址:从 https:// 写起,不要用相对路径,也不要挂上带跟踪参数的临时地址。

几种常见的写法错误

版本清单只放在主站

主站页面列出了全部语言版本,但子站页面完全没有标注。搜索引擎爬到子站时看不到任何版本关系,只能把它当成一篇独立内容处理,重复问题就出现了。正确做法是让每个版本都携带完整的版本清单。

靠脚本动态写入

把 hreflang 标签交给前端脚本在加载后插入,看似省事,实际增加了不确定性:如果脚本执行失败或被拦截,版本关系就等于不存在。能写在模板里的,就不要留给脚本。

把语言和地区混为一谈

面向简体中文用户的页面标成 zh,面向新加坡华语用户的页面也标成 zh,等于主动放弃区分。语言和地区是两个维度,需要时应当组合标注,例如 zh-Hans-SG 这类写法。

漏掉 x-default

当用户的语言和地区都不在清单里时,需要一个默认版本承接,这就是 x-default 的作用。通常指向语言选择页或英文版本。如果全站没有语言选择页,也不打算设置默认版本,至少要确认这个缺口是有意为之,而不是忘了。

对照自查清单

  1. 每个版本的页面里,是否都能看到完整的版本清单,包含自己?
  2. 互指是否双向成立,是否存在只有单向链接的孤点?
  3. 清单里的 URL 是否全部可访问,有没有已经改版或下线的旧地址?
  4. URL 是否与 canonical 指向的地址一致?两处不一致会产生互相矛盾的信号。
  5. 语言代码是否经过核对,没有拼写和大小写错误?
  6. 是否设置了 x-default,或者明确决定不设?
  7. 版本清单是否随新版本上线同步更新,而不是停留在去年那一版?

别用自动跳转代替标注

按照访客 IP 或浏览器语言做 302 跳转,对用户来说可能更方便,但对抓取来说,每个版本可能只被看到一次,甚至永远只看到跳转后的那个版本。跳转和标注解决的是两件事:跳转服务的是人,hreflang 服务的是版本关系的识别。

如果确实需要按地区跳转,建议保留一个可访问的默认入口,让蜘蛛能够稳定地拿到各个版本,而不是被一律导向同一个页面。

和 canonical、站点地图的配合

多语言页面的 canonical 应当指向自身,而不是全部指向主语言版本,否则等于自己声明其他版本都是重复内容。版本清单也可以写进站点地图,用 xhtml:link 标注,但前提是站点地图本身保持最新,地址和页面上的一致。两边写的内容不同,是这类问题里最难排查的一种。

最后提醒一点:版本关系标注是给机器看的说明,它不能替代内容本身。如果各语言版本只是字面翻译,没有本地化的表述、价格、联系方式,用户依然会跳回主站,标注写得再规范也留不住人。