站点从 /en/ 改成 /en-us/ 只改了页面链接 hreflang 里还写着 /en/ 那批地址 301 只覆盖了一部分 其余直接 404 整组 hreflang 因为有一个目标不可达被忽略 英文版在其他地区完全不出结果

一开始怀疑是「hreflang 生成依赖固定数组 不读实际路由」,查了一圈,方向不对。

把日志和配置对完,能解释这个现象的基本就这几处。改路径时只改了内链 没同步 hreflang。也可能是旧路径 301 只做了一部分 部分语言页直接 404。

少数情况下是没有做 hreflang 目标可达性巡检。

第一件事是抽出所有 hreflang 目标地址

curl -s https://www.example.com/p/1 | grep -o 'href="https://[^"]*" hreflang' | head

接着逐个校验目标返回码

for u in $(cat hreflang.txt); do curl -s -o /dev/null -w '%{http_code} ' $u; done

再往下把 hreflang 前缀改成实际路径

sed -i 's#/en/#/en-us/#g' hreflang.conf

补全旧路径 301 并复验

curl -sI https://www.example.com/en/p/1 | grep -i location

别只看报错消失,验证要多做一步。hreflang 目标全部 200 整组生效 各地区搜索结果出现对应语言版本。

这里还有个坑。hreflang 是一组互相引用的声明 只要有一个目标打不开 整组都可能被丢弃。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。

作者 9823189