先把 hreflang 的位置摆正
hreflang 的作用是告诉搜尋引擎:這几個 URL 是同一内容的不同語言或地区版本,請按用戶的語言给出合适的那個。它處理的是對應關系與展示的問题,不负责让頁面進索引。一個語言版本能不能被收錄,仍然取决于它能否被抓到、是否允许索引、以及内容本身值不值得留。
所以当你發現“只收錄了英文版,中文版没進索引”时,先別急着改 hreflang,問题多半出在更前面的环节。
語言版本被顶替的常见原因
1. 蜘蛛根本走不到其他版本
不少站点用 JS 讀取浏览器語言或 cookie,再跳到對應語言。對真實用戶很方便,但蜘蛛通常没有語言偏好,可能永遠只落在一個版本上。其他語言版本的 URL 没有被任何站内連結指向,就只能靠站点地图被發現。
- 語言切換器是按钮加脚本,没有真正的 a 連結
- 切換後 URL 不變,只是前端替換文案
- 其他語言版本只出現在站点地图里,站内没有任何入口
2. canonical 把語言版本“降級”了
另一種常见寫法是:所有語言版本的 canonical 都指向預設語言版本。這等于告诉搜尋引擎“我只是它的副本”,那它自然不會單獨留在索引里。如果每個版本都是獨立内容,canonical 應该自指,語言對應關系交给 hreflang 表達。
3. hreflang 只标了單向
hreflang 需要成對出現:A 版本声明 B 是它的英文版,B 版本也要声明 A 是它的中文版。只在一侧标注,另一侧毫無說明,對應關系就是残缺的,搜尋引擎可能只認它先看到的那一侧。
4. 各語言版本差异太小
如果几個版本是机器翻译直出、正文结构完全一致,只換了十几個词,那么從索引角度看它們高度相似。這種情况下,即使 hreflang 寫得再完整,也可能只有一個版本被保留下来。hreflang 不會让重复内容變得不重复。
5. 語言代碼與 URL 寫法不统一
語言代碼用错、大小寫混乱、有的用子目錄有的用子域名,或者 hreflang 值寫成相對路径,都會削弱标簽的可识別度。建议统一使用绝對 URL,語言代碼遵循規范寫法,例如 zh-Hans、zh-Hant、en、en-US。
hreflang 是“說明關系”,不是“强制保留”。它無法對抗 canonical、noindex、抓取不到這些更硬的條件。
一條可执行的自查顺序
- 能否直接訪問:關掉 JS、清空 cookie,逐個粘贴每個語言版本的 URL,確認都能返回 200 且正文完整。
- 有没有站内入口:在不依赖脚本的前提下,頁面里是否有指向其他語言版本的 a 連結。没有就补上,放在頁脚通常最省事。
- canonical 是否自指:每個語言版本指向自己,不要把整组都指到預設版本。
- hreflang 是否双向:抽查两三個頁面,確認 A 指向 B、B 也指向 A,並包含 x-default。
- 是否被禁止:检查這些 URL 有没有被 robots.txt、noindex 誤挡,尤其是測試期留下的規則。
- 内容差异:随机抽一段正文對比,判断是“翻译”還是“換词”。差异不足的頁面,考虑合並或明确指定保留哪個版本。
- 站点地图:確認各語言版本都在 sitemap 中,且與頁面上的 hreflang 保持一致。
如果确實只想保留一個版本
有些站点的多語言版本只是過渡产物,维護成本高、内容又接近。這时應该明确表態,而不是靠 hreflang 指望搜尋引擎自己挑:
- 保留的版本:canonical 自指,正常參與索引
- 不保留的版本:用 canonical 指回保留版本,或直接 noindex,两者選一,不要同时用
- 如果该版本還要给用戶看,就保留可訪問性,只是不進索引
需要提醒的是,這類調整從生效到索引中反映出来需要時間,通常以周為單位。改完之後留出观察窗口,不要因為一两天没變化就反复切換标簽。
观察什么,別盯什么
比起天天數“收錄了几個語言版本”,更有價值的是看:每個語言版本是否有稳定抓取、搜尋结果里是否出現了错誤語言的版本、点击後是否跳到了用戶看不懂的語言。抓取记錄稳定、用戶能落到正确語言,說明配置方向是對的;索引數量本身會有波動,不必因為短期起伏就大改结构。