先看现象。多语言站的 PDF 手册只能用响应头输出 hreflang,运维在 Nginx 里加了一组 Link,HTML 页面又由插件输出另一组,两边 en 地址不一致,GSC 报备用网页语言标记冲突。
这类报错背后常见的原因有几处,逐个排除就行。响应头里的 hreflang 与 head 里的地址不同,蜘蛛取并集后互相矛盾。也可能是add_header 只对 200 生效,301 响应上没有这组头。
另外,头字段里多个 Link 用逗号分隔但漏了引号,解析被截断。
少数情况下是插件对同一语言输出了两个地区代码。
先读响应头里的 Link 字段
curl -sI https://www.example.com/en/manual.pdf | grep -i '^link'
然后对照页面里的 hreflang
curl -s https://www.example.com/en/ | grep -o 'hreflang="[^"]*"'
修正头字段写法
add_header Link '<https://www.example.com/zh/>; rel="alternate"; hreflang="zh"';
复查 301 响应是否也带标记
curl -sI https://www.example.com/en/old | grep -i link
改之前我把相关日志按时间截了一段存着,事后对时间线用得上。
恢复的判定其实很直接。头字段与页面内的 hreflang 完全一致,GSC 语言标记冲突消失,PDF 也能被正确归组。
这里还有个坑。HTTP 头适合 PDF、视频这类没有 head 的文件,HTML 页面两处都写就要保证逐字一致。报错文案容易误导,真正的原因往往在相邻那一层的日志里。
