负载均衡终止 TLS,回源走 80,WordPress 的 siteurl 是 https。前台部分资源仍输出 http 地址,Chrome 控制台报 Mixed Content,图片被拦。试过在主题里批量替换,重新保存后又出现。
排查方向其实有限,先把可能性排一排。反代没有传 X-Forwarded-Proto,应用判断当前请求是 http;is_ssl() 返回 false,插件生成的资源地址回落到 http;页面内容里硬编码了 http 的外链图片;HSTS 开启后混合内容会被直接拦截,不给用户选择。
上来先找出页面里的 http 资源
curl -s https://www.example.com/ | grep -o 'http://[^" ]*' | head
然后把协议信息传给上游
fastcgi_param HTTPS on; fastcgi_param HTTP_X_FORWARDED_PROTO https;
修正站点地址
wp option update siteurl 'https://www.example.com' && wp option update home 'https://www.example.com'
复验资源协议
curl -s https://www.example.com/ | grep -c 'src="http://'
改之前我把相关日志按时间截了一段存着,事后对时间线用得上。
别只看报错消失,验证要多做一步。页面里不再输出 http 资源,控制台的混合内容告警清零,图片和字体的加载恢复正常。
提醒一点。反代场景下应用看到的协议和用户看到的不是一回事,所有判断协议的地方都得靠转发头补齐。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。
