现场是这样的。全站迁到 HTTPS 半年,控制台仍报 mixed content,抽查发现正文里 1.2 万张图片是 http 开头的图床地址,编辑器里存的就是老地址,模板层替换不了。
中间走过弯路,把「图床只开了 https,http 请求 301 过去仍被 CSP 拦」当成主因,改完现象没变。
排查方向其实有限,先把可能性排一排。历史文章正文写死了 http 图片地址,输出时没做协议替换;数据库存的是绝对地址,换域名后没有同步;部分外部图床不支持 https,只能本地化。
先统计正文里的 http 资源数量
SELECT COUNT(*) FROM wp_posts WHERE post_content LIKE '%http://img.example.com%';
批量替换成 https
UPDATE wp_posts SET post_content = REPLACE(post_content,'http://img.example.com','https://img.example.com');
随后替换后抽查页面输出
curl -s https://www.example.com/post/1 | grep -o 'http://img[^"]*' | head
剩下的就是查 CSP 里有没有漏掉的来源
grep -rn 'Content-Security-Policy' /etc/nginx/
怎么算真的好了,看的是同一批现象。正文里 http 图片链接归零,控制台不再报 mixed content,图片搜索的抓取恢复正常。
改数据库前先导出备份,替换字符串要带域名,只换 http 前缀会误伤正文里的示例代码。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。
