站点做了多语言或多地区版本之后,最容易出问题的往往不是翻译质量,而是各版本之间的对应关系。搜索引擎判断“这些地址是不是同一内容的语言变体”,主要看 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 理解成“提示”而不是“命令”更合适:它帮助搜索引擎理解版本关系,但不能替代内容本身的独立价值。多个语言版本如果只是机器翻译的近似复制,对应关系写得再规范,也很难获得理想的展示。