语言切换器写的是 a href="#en",点击后由 JS 读 hash 切换文案和 URL 参数。页面在服务器端只有一个地址,九种语言的链接在 HTML 里看起来完全一样。英文内容上线两个月,一条都没被单独收录。

把日志和配置对完,能解释这个现象的基本就这几处。hash 不会发送到服务器,服务端永远只返回同一份内容;切换后没有更新地址栏,缺少可被抓取的独立地址;canonical 只有一个,等于声明所有语言都是同一页;hreflang 指向的地址全是同一串,组内无法成立。

第一件事是看切换器的链接指向哪里

curl -s https://www.example.com/ | grep -o 'href="#[a-z-]*"' | head

接着确认不带 hash 的地址返回什么语言

curl -s https://www.example.com/ | grep -o '<html[^>]*lang="[^"]*"'

然后把切换改成真实路径,每个语言一个可访问地址

location /en/ { try_files $uri $uri/ /en/index.html; }

补上各语言之间的 hreflang 与 canonical

for l in zh en ja; do curl -s https://www.example.com/$l/ | grep -c 'hreflang'; done

别只看报错消失,验证要多做一步。九个语言各有独立地址,hreflang 组内互指成立,英文页在一个月内陆续进入索引。

容易忽略的是,用锚点做语言切换在用户体验上没毛病,但对抓取来说等于只存在一个页面,内容和地址必须能分开。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。

作者 9823189