站点做了多語言或多地区版本之後,最容易出問题的往往不是翻译质量,而是各版本之間的對應關系。搜尋引擎判断“這些地址是不是同一内容的語言變体”,主要看 hreflang 注解、canonical 声明和頁面之間的互鏈。三處信号一旦打架,常见的结果就是各版本互相分流,或者只有主版本被保留,其余版本長期没有存在感。
先把自己有多少個版本理清楚
動手改代碼之前,建议先做一張表,把每個版本的基本信息列出来,這張表本身就是後續自查的依據:
- URL 地址,尽量保持结构對應,例如 /cn/、/en/ 或 /zh-hans/;
- 語言或地区代碼,如 zh-Hans、zh-Hant-HK、en-SG;
- 该頁面的規范地址(canonical)指向哪里;
- 它在頁面上指向了哪些其他語言版本,又是否被對方回指。
版本數量不多的站点,這張表几分钟就能填完,但能省掉後面大量的猜测。
几個高频出错的点
1. hreflang 指向了不存在或已改版的地址
改版时只換了 URL,忘了同步 hreflang,是最常见的情况。這類注解等于给搜尋引擎指了一條死路,既浪費抓取,也让對應關系断掉。每次調整 URL 结构後,應该把 hreflang 一起過一遍。
2. 只寫單邊,没有互相指向
hreflang 需要相互声明。A 頁面寫了指向 B,B 頁面也要寫回指向 A,否則這種對應關系不成立。用脚本批量检查时,可以按“是否互為镜像”的思路去比對。
3. x-default 缺失或指向含糊
x-default 用来指定没有匹配到合适語言时展示哪個版本,通常指向語言選擇頁或預設版本。它不必每個頁面都寫,但站点級的選擇頁應该有明确指向,避免出現空值或多重冲突。
4. canonical 和 hreflang 互相矛盾
如果英文頁的 canonical 指向中文頁,等于告诉搜尋引擎“這两頁其實是一頁”,此时 hreflang 的語言区分就失去意义。canonical 應当是自指的,語言区分交给 hreflang 處理。
5. 用 IP 或浏览器語言做强制跳轉
用戶一進首頁就被跳到某個語言版本,看上去体驗不错,但蜘蛛從不同地区抓取时容易只看到同一個版本,其余版本很难被發現。更稳妥的做法是给出明确的語言切換入口,把選擇權留给用戶和爬虫。
一份可执行的自查清單
- 列出所有語言版本 URL,確認每個地址返回 200,没有多余跳轉。
- 逐頁核對 hreflang 是否為双向声明,代碼拼寫是否規范,避免随手寫成不标准的形式。
- 检查自指是否遗漏:每個頁面也應当包含指向自己的 hreflang。
- 確認 canonical 自指,且不與語言版本互相覆盖。
- 检查站点地图是否覆盖各語言版本,不要只提交主語言。
- 確認語言切換連結是可抓取的 a 标簽,而不是只绑定了 JS 事件。
- 抽查几组頁面,看返回内容與声明的語言是否一致。
- 记錄改動時間,方便後續在日誌和抓取資料里對照效果。
改完之後怎么看效果
調整 hreflang 不會立刻带来變化,通常需要等搜尋引擎重新抓取並處理。可以结合服務器日誌,观察各語言版本的抓取频次是否趋于均衡;也可以搜尋几個長尾词,看返回的是不是對應語言版本。若某個版本長期没有任何抓取记錄,優先检查它是否被 robots 規則、跳轉或 canonical 挡住。
把 hreflang 理解成“提示”而不是“命令”更合适:它帮助搜尋引擎理解版本關系,但不能替代内容本身的獨立價值。多個語言版本如果只是机器翻译的近似複製,對應關系寫得再規范,也很难获得理想的展示。