根本原因是phpmyadmin因x-forwarded-proto缺失或$_server['https']非'on'误判为http环境而强制301跳转https,nginx以http转发导致跳转闭环;需在nginx中透传x-forwarded-proto与host,并在phpmyadmin配置中显式信任代理头。

根本原因是 phpMyAdmin 检测到 X-Forwarded-Proto 缺失或 $_SERVER['HTTPS'] 未置为 on,误判为非 HTTPS 环境,主动 301 跳转到 HTTPS 地址;而 Nginx 用 HTTP 转发请求给后端,跳转后又打回 Nginx,形成闭环。
phpMyAdmin 自动跳转 HTTPS 的触发条件
phpMyAdmin 默认启用安全重定向逻辑:只要它认为当前连接不安全(即协议不是 HTTPS),就会强制返回 Location: https://...。这个判断依赖两个关键点:
-
$_SERVER['HTTPS'] === 'on'(PHP 内部标识) - 或
$_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https'(当配置了信任代理时)
但 Nginx 反向代理默认不传 X-Forwarded-Proto,phpMyAdmin 收不到该头,$_SERVER['HTTPS'] 仍为空或 off,于是每次请求都触发跳转。
必须在 Nginx 中透传 X-Forwarded-Proto 和 Host
仅加 proxy_set_header Host $host; 不够——phpMyAdmin 构造跳转 URL 时会拼接 $_SERVER['HTTPS'] + $_SERVER['HTTP_HOST'],缺一不可。正确写法是:
location /phpmyadmin/ {
proxy_pass http://127.0.0.1:8080/;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
注意:$scheme 是动态值(http 或 https),绝不能硬编码成 https;否则 HTTP 入口也会被后端当成 HTTPS,导致其他问题。
phpMyAdmin 必须显式信任转发头
Nginx 传了头,phpMyAdmin 默认也不认。需在 config.inc.php 顶部(<?php 之后)插入:
if (!empty($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
$_SERVER['HTTPS'] = 'on';
}
同时确认以下两点:
-
$cfg['ForceSSL'] = true;—— 若启用,必须确保上述逻辑已生效,否则必循环 - 数据库中或配置里没有硬编码
https://localhost/phpmyadmin类绝对 URL;所有跳转应基于$_SERVER动态生成
避免 proxy_redirect 干预 Location 头
phpMyAdmin 返回的 Location 通常是相对路径(如 /phpmyadmin/index.php),不需要重写。但若启用了 proxy_redirect on; 或模糊规则(如 proxy_redirect http://127.0.0.1/ /;),Nginx 可能错误地把本该保留的路径又塞回自己,加剧循环。
最稳妥做法是显式关闭:
proxy_redirect off;
除非你明确知道后端返回的是含内网地址的绝对 URL(比如 http://127.0.0.1:8080/login),才考虑用正则精准重写:
proxy_redirect ~^http://[^/]+(/.*)$ $scheme://$host$1;
真正卡住的地方往往不是 Nginx 少写了一行,而是 phpMyAdmin 的 $_SERVER['HTTPS'] 始终没被设对——哪怕 Nginx 配置全对,只要这行 PHP 逻辑没跑通,循环就停不下来。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











