这类问题我又碰上了一次。Cloudflare 开了 Rocket Loader 之后,文章页的 canonical 和 hreflang 被脚本重排,查看源代码发现标签顺序变了,蜘蛛抓到的 canonical 指向列表页。试过关掉主题里的异步加载,问题照旧。
第一反应是「边缘改写与后端输出的标签叠加,页面出现两份 canonical」,验证下来不成立。
这类报错背后常见的原因有几处,逐个排除就行。Rocket Loader 把内联脚本延后执行,动态插入的 link 覆盖了原有标签;主题用 JS 生成 canonical,脚本顺序一变就取到错误页面;缓存里存的是改写后的 HTML,源站改回来也不立刻生效。
数一下页面有几个 canonical
curl -s https://www.example.com/post/1 | grep -c 'rel="canonical"'
拿到实际指向的地址
curl -s https://www.example.com/post/1 | grep -o 'rel="canonical" href="[^"]*"'
接着绕过缓存在源站侧对比
curl -s -H "Cache-Control: no-cache" https://www.example.com/post/1 | grep -o 'rel="canonical" href="[^"]*"'
末了按路径关掉这个功能后复测
curl -s https://www.example.com/post/1 | grep -c 'data-cf-settings'
改完先别撤,确认这几项。页面只剩一个 canonical 且指向自身,hreflang 顺序与源站一致,重复网页报告不再新增条目。
容易忽略的是,动态注入 canonical 本身就不可靠,标签应该由服务端直出,前端最多做兜底。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。
