记录一下那天晚上的排查过程。台湾站用 ?lang=tw 切换语言,同一篇正文对应三份参数地址,canonical 全部指向不带参数的默认页。三个月后收录的只有默认语言,另外两份一直停在已发现。试过在 robots 里放开参数,没有改善。
刚开始盯着「语言切换按钮用 JS 改 query 不刷新页面,蜘蛛根本触发不到」,折腾了半个多小时,排掉了。
原因不止一个,得分开看。参数页 canonical 自指默认语言,等于告诉蜘蛛另外两份都是副本。少数情况下是参数版本之间没有 hreflang 互指,蜘蛛不知道它们是替代关系。
少数情况下是CDN 缓存键忽略 query,三个版本回源拿到的都是同一份 HTML。
先对比三个参数地址的头部
for l in zh tw hk; do curl -s "https://www.example.com/post-1/?lang=$l" | grep -i canonical; done
接着把参数重写成独立目录
rewrite ^/post-1/(tw|hk)/?$ /post-1/?lang=$1 last;
补三向 hreflang
printf '<link rel="alternate" hreflang="zh-TW" href="https://www.example.com/post-1/tw/">\n' >> /tmp/head.txt
末了统计各版本的抓取次数
awk '{print $7}' /var/log/nginx/access.log | grep -c 'lang=tw'
别只看报错消失,验证要多做一步。参数地址改成目录后,三个版本各自被单独抓取,台湾版在两周内进索引,默认页的排名没有被分走。
提醒一点。参数式多语言最容易被缓存和 canonical 一起坑,能上目录就别用 query,后期迁移成本只会更高。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。
