站点运营

站点运营:多語言與多地区版本自查,別让版本關系寫成糊涂帳

多語言、多地区站点如果版本關系没标注清楚,同一篇内容可能被拆成几個互相竞争的頁面。本文從是否需要多版本讲起,梳理 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 标注,但前提是站点地图本身保持最新,地址和頁面上的一致。两邊寫的内容不同,是這類問题里最难排查的一種。

最後提醒一点:版本關系标注是给机器看的說明,它不能替代内容本身。如果各語言版本只是字面翻译,没有本地化的表述、價格、联系方式,用戶依然會跳回主站,标注寫得再規范也留不住人。