报错是这么冒出来的。移动端搜索点进来落到 m.baidu.com 的转码页上,地址栏是百度的域名,页面 title 被改成了自己拼的关键词,用户根本回不到原站。

中间走过弯路,把「转码页和原页没有互指的 canonical,权重算不清」当成主因,改完现象没变。

这类报错背后常见的原因有几处,逐个排除就行。页面没有声明 no-transform,百度默认允许对移动页转码。另一种情况是站点缺少移动端适配声明,百度选择用自己的渲染结果。

不容易想到的是,原站的首屏依赖 JS,转码后正文残缺。

先确认页面有没有禁止转码的声明

curl -s https://www.example.com/a/ | grep -i 'no-transform\|Cache-Control'

再往下在响应头里补上 no-transform

add_header Cache-Control "no-transform";

然后核对移动适配声明是否生效

curl -s https://www.example.com/a/ | grep -i 'applicable-device'

等前面都确认过,再用移动 UA 复查返回的正文完整度

curl -s -A 'Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X)' https://www.example.com/a/ | wc -c

恢复的判定其实很直接。移动搜索结果里的落地地址回到自己的域名,快照 title 与原页一致,百度统计里的跳出率同步下降。

这里还有个坑。no-transform 只对遵守协议的抓取端有效,正文本身在移动端渲染不全时,转码问题解决了体验仍然过不去。这类问题最好一次改到位,反复小改反而容易把原因搅混。

作者 9823189