多语言站有九个语言版本,head 里输出的 hreflang 是 en、de、ja,html 标签写的却是 en-US、de-DE、ja-JP。GSC 的国际定位报告显示只有中文版被识别,切换器在搜索结果里从来不出现。改过两版标签顺序,也补了 x-default,报告没变化。

一开始怀疑是「标签是用 JS 插入的,蜘蛛渲染前读到的 head 里是空的」,查了一圈,方向不对。

把日志和配置对完,能解释这个现象的基本就这几处。hreflang 和 html lang 用了不同粒度的代码,两边对不上时整组被丢弃。另一种情况是返回链接不全,de 页面没有指回 en 页面,组内互指不成立。

还有一种情况,每个语言版本的 canonical 都指向中文页,等于自己声明了重复。

动手时先抓一份英文页的 head,核对 hreflang 与 lang 是否同粒度

curl -s https://www.example.com/en/ | grep -Eo 'hreflang="[^"]*"|lang="[^"]*"'

随后检查每个版本的 canonical 是否自指

curl -s https://www.example.com/de/ | grep -o 'rel="canonical"[^>]*'

接着确认返回链接覆盖全部语言,包含自身

curl -s https://www.example.com/en/ | grep -c 'rel="alternate"'

等前面都确认过,再把 lang 和 hreflang 统一到同一张配置表输出

grep -rn 'hreflang' templates/base.html

恢复的判定其实很直接。三个版本的 hreflang 与 lang 完全对齐,返回链接数量一致,两周后国际定位报告里九种语言全部识别出来。

补一句。Google 认的是 BCP47 里的一整串,en 和 en-US 都合法,但必须全站一致,混用等于让解析器二选一。报错文案容易误导,真正的原因往往在相邻那一层的日志里。

作者 9823189