这个坑值得记一笔。测试环境加的 canonical 是 http://192.168.1.20:8080/post/123,上线时配置文件整段带了过来。页面正常访问,GSC 的网址检查里规范网址一栏显示的却是内网地址,收录数量一周内掉了三成,日志里也看不到蜘蛛重复抓取的迹象。
刚开始盯着「构建时的 PUBLIC_URL 没改 静态生成的 canonical 全是内网地址」,折腾了半个多小时,排掉了。
这类报错背后常见的原因有几处,逐个排除就行。模板把环境变量里的内部地址直接渲染进了 canonical;反向代理改了 Host 头 站点按 Host 拼出的绝对地址变成内网地址;多环境共用一份配置 生产环境读到了测试环境的域名。
先在浏览器外抓一次页面看 canonical
curl -s https://www.example.com/post/123 | grep -o '<link rel="canonical"[^>]*>'
再往下检查代理层的 Host 透传设置
grep -n 'proxy_set_header Host' /etc/nginx/conf.d/*.conf
随后改成相对路径避免环境差异
<link rel="canonical" href="/post/123">
成批核对全站 canonical 的域名分布
curl -s https://www.example.com/sitemap.xml | grep -o '<loc>[^<]*' | head -50 | xargs -I{} curl -s {} | grep -o 'canonical" href="[^"]*' | sort | uniq -c
别只看报错消失,验证要多做一步。把内网地址改成相对路径并重发一次后,网址检查里规范网址恢复为线上域名,两周内收录数量回到原来的水平。
补一句。canonical 用相对路径能规避大部分环境差异,只要页面地址本身是规范地址,解析出来的结果就不会错。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。
