报错是这么冒出来的。多语言站的英文页 canonical 写的是不带语言前缀的地址,hreflang 里的自指却是 /en/ 版本。GSC 国际化报告一直提示缺少返回链接,英文页三个月只收录了 30 条。

中间走过弯路,把「canonical 由插件生成,hreflang 由主题模块输出,数据源不同」当成主因,改完现象没变。

原因不止一个,得分开看。canonical 指向默认语言页,等于说英文页只是副本。也可能是hreflang 组要求每个版本自指,两处地址不一致整组断链。

不容易想到的是,部分页面 canonical 用了 http,与 hreflang 的 https 不匹配。

上来先抽查页面里两个标签的实际取值

curl -s https://www.example.com/en/post-1 | egrep -o '(canonical|hreflang)="[^"]*"'

然后让 canonical 与 hreflang 自指保持同值

python fix_alt.py --self-canonical --locale en

接着统一协议与尾斜杠写法

curl -s https://www.example.com/en/post-1 | grep -o '<link rel="canonical"[^>]*>'

复验组内互指是否完整

python check_hreflang.py --sitemap sitemap.xml

恢复的判定其实很直接。英文页的 canonical 与自指都是同一个地址,GSC 国际化报告不再报缺少返回链接,英文收录涨到 600 条。

这里还有个坑。canonical 说的是以哪个地址为准,hreflang 说的是这些是同一内容的不同语言,两处指向不一致时整组都拿不到信号。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。

作者 9823189