多语言站的 sitemap 用 xhtml:link 声明各语言版本,上线后 GSC 里 hreflang 一栏全是空。检查发现命名空间写成了 http://www.w3.org/1999/xhtml 而不是 1999/xhtml。
一开始怀疑是「xhtml:link 的 hreflang 用了大写 CN,与页面里的不一致」,查了一圈,方向不对。
原因不止一个,得分开看。命名空间写错,解析器不认识 xhtml:link 前缀,整段被忽略。还有一种是每个 url 节点里的备用链接数超过 12 个,超出的被丢弃。
另外,sitemap 没有声明 xmlns:xhtml,前缀直接被当非法标签。
校验命名空间声明
curl -s https://www.example.com/sitemap.xml | head -3
随后用解析器验证标签是否被识别
python -c "import lxml.etree as E;r=E.parse('sitemap.xml');print(len(r.findall('.//{http://www.w3.org/1999/xhtml}link')))"
修正命名空间与语言代码大小写
curl -s https://www.example.com/sitemap.xml | grep -o 'hreflang="[^"]*"' | sort -u
末了重新提交并观察 hreflang 识别数
curl -s https://www.example.com/sitemap.xml -o /dev/null -w '%{http_code}\n'
别只看报错消失,验证要多做一步。解析器能数出全部备用链接,GSC 的国际化报告里开始出现语言分组,各语言版本的收录量同步上涨。
提醒一点。XML 命名空间错一个字符就是静默失效,改完一定用解析器数一遍节点,别只看浏览器能不能打开。报错文案容易误导,真正的原因往往在相邻那一层的日志里。
