报错是这么冒出来的。多语言站的英文页 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 说的是这些是同一内容的不同语言,两处指向不一致时整组都拿不到信号。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。
