if ($http_x_forwarded_proto != 'https') { return 301 https://$host$request_uri; }
// wp-config.php
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') { $_SERVER['HTTPS'] = 'on'; }

站点挂在负载均衡后面,浏览器打开 https 地址后不停闪,开发者工具里能看到 https 和 http 交替跳,最后报重定向次数过多。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。

追下去是这么回事:TLS 在负载均衡那层就终止了,到源站是 http,WordPress 的 is_ssl 只看源站端口,判断成非 https。强制跳转的逻辑于是把已经加密的请求又往 https 推,形成环。

「is_ssl 判断」排查到最后往往是很小的一处差异,前面那些复杂猜测可以先放一放。权限不要一口气开到最大,先加到够用再往上试,范围小才好收。

把复现步骤压到三条以内,交给同事也能跑出来,才算真的定位清楚。

处理上按这个顺序:让负载均衡带上 X-Forwarded-Proto 头,源站按这个头判断协议;在 wp-config.php 里补一段读取这个头的逻辑,给 $_SERVER['HTTPS'] 赋值;Nginx 层再加一条,只有确实不是 https 时才跳;改完用 curl 带不同的头验证两种请求。

确认没问题再收工,https 地址打开不再跳转,http 地址只跳一次就停在 https,浏览器不再报重定向次数过多。

作者 9823189