这类问题我又碰上了一次。站点在 CDN 后面,源站收到的请求永远是 http,程序按当前协议拼 canonical,全站输出 http 前缀。https 页面自己指向 http 地址,被当成两套内容。
第一反应是「站点地址配置里写死了 http」,验证下来不成立。
真正麻烦的地方在于,几个原因的现象几乎一样。CDN 回源没有带 X-Forwarded-Proto 头;源站不信任代理头,一直按 http 处理;混合内容告警被关掉,问题一直没暴露。
动手时先看源站收到的协议相关响应头
curl -sI https://www.lu0.cn/ | grep -i 'x-forwarded-proto\|location'
随后让回源请求补上协议头
proxy_set_header X-Forwarded-Proto $scheme;
程序里信任代理并强制 https 拼地址
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO'])) { $_SERVER['HTTPS'] = 'on'; }
全站复查 canonical 前缀
curl -s https://www.lu0.cn/1.html | grep -o 'rel="canonical"[^>]*'
中间停过一次,把已经改的东西回滚干净,再重新来一遍。
怎么算真的好了,看的是同一批现象。所有 canonical 变成 https 绝对地址,索引里的重复条目两周内合并,抓取不再反复请求 http 版本。
容易忽略的是,这类问题在 CDN 后面非常普遍,把协议头透传写进上线检查项,比事后清理索引便宜太多。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。
