先看现象。nginx 反代到内网的 WordPress,前台正常,进 wp-admin 一直 302 循环,浏览器提示重定向次数过多,源站日志里每次请求的协议都是 http。
原因不止一个,得分开看。nginx 没传 X-Forwarded-Proto,WordPress 认为当前是 http,于是不断跳到 https。还有一种是wp-config.php 里 WP_HOME 写死了 http 的地址。
另外,代理没有透传 Host 头,源站按默认站点生成跳转地址。
少数情况下是源站也开了强制 HTTPS 插件,两边各跳一次形成循环。
先看响应头里的跳转目标
curl -sI https://www.example.com/wp-admin | grep -i location
补齐代理头设置
printf 'proxy_set_header Host $host;\nproxy_set_header X-Forwarded-Proto $scheme;\nproxy_set_header X-Real-IP $remote_addr;\n' > /etc/nginx/conf.d/wp.conf && nginx -t && nginx -s reload
接着在配置里固定站点地址
printf "define('WP_HOME','https://www.example.com');\ndefine('WP_SITEURL','https://www.example.com');\n" >> /var/www/wp/wp-config.php
末了确认后台能正常进入
curl -s -o /dev/null -w '%{http_code} %{num_redirects}\n' https://www.example.com/wp-admin/
白天有业务在跑,能验证的部分都压到了晚上做。
当时还开着另一个排查窗口,两边日志对照着看才定位到。
恢复的判定其实很直接。访问 wp-admin 返回 200 且重定向次数为零,登录后能进入仪表盘,日志里的请求协议变成 https。
容易忽略的是,WordPress 判断协议只看头,反代场景必须传 X-Forwarded-Proto;写死 WP_HOME 之后换域名要记得改,否则又会跳回旧地址。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。
