先看现象。页面 head 里的 hreflang 是完整的三语互指,sitemap 里只有 loc 没有 xhtml:link,Google 以 sitemap 为准,整组标注没有生效。
原因不止一个,得分开看。两处都声明时以 sitemap 为优先,缺失即视为未标注。也可能是sitemap 由插件生成,不读主题里的 hreflang 配置。
还有一种情况,xhtml 命名空间没声明,节点被解析器跳过。
另外,sitemap 只收录中文页,另两种语言没有条目。
动手时先检查 sitemap 的命名空间
curl -s https://www.example.com/sitemap.xml | head -3
接着确认有没有备用链接节点
curl -s https://www.example.com/sitemap.xml | grep -c 'xhtml:link'
再往下在生成器里补上节点
<xhtml:link rel="alternate" hreflang="en" href="https://www.example.com/en/post/1/"/>
校验修改后的 XML
xmllint --noout sitemap.xml
同样的操作我在测试机上先走了一遍,线上只做验证过的部分。
这台环境是别人交接的,不少默认值被动过,只能一项项核。
改完先别撤,确认这几项。sitemap 里每条地址都带两个以上备用链接节点,与 head 中的值一致,GSC 里备用网页分组恢复正常。
两处都写不算冗余,但必须一致,不一致时更权威的那处会把另一处覆盖掉。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。
