$cfg['ForceSSL'] 已废弃且无效,真正关键的是正确配置 PMA_ABSOLUTE_URI 为 HTTPS 地址,并在 Nginx 中透传 X-Forwarded-Proto 等头;否则 PHP 误判协议导致 cookie 设置失败。
![为什么必须在phpmyadmin中设置$cfg[\'forcessl\']?](https://img.php.cn/upload/article/000/969/633/179410347042346.png)
$cfg['ForceSSL'] 不是必须设置的,而且在新版 phpMyAdmin 中已废弃。它只在旧版本(约 4.x 早期)中起作用,用于强制会话 cookie 标记 Secure 属性;但现代部署中,它既不解决根本问题,也无法替代真正的 HTTPS 基础设施配置。
为什么设了 $cfg['ForceSSL'] = true 还会 Failed to set session cookie?
因为该配置仅影响 cookie 的 Secure 标志位,而前提是 PHP 能正确识别当前请求走的是 HTTPS。如果 phpMyAdmin 运行在反向代理(如 Nginx)后,$_SERVER['HTTPS'] 仍是 off,PHP 就认为这是 HTTP 请求——此时即使 $cfg['ForceSSL'] = true,setcookie() 仍会被 PHP 拒绝(报 Failed to set session cookie),因为底层协议不匹配。
- 它不感知
X-Forwarded-Proto,也不读取代理头 - 它不能修复 Nginx 没传
Host或X-Forwarded-Proto导致的协议误判 - 它无法绕过浏览器对混合内容(HTTP 资源嵌入 HTTPS 页面)的拦截
真正起作用的是 PMA_ABSOLUTE_URI 和反向代理头透传
在 Nginx + phpMyAdmin 组合中,决定跳转地址、表单 action、JS 请求路径和 cookie 安全性的核心是 PMA_ABSOLUTE_URI。这个配置直接覆盖所有 URL 构建逻辑,比依赖运行时探测更可靠。
- 必须设为完整 HTTPS 地址,例如:
https://db.example.com/phpmyadmin/(末尾斜杠不能少) - 配合 Nginx 的三行关键 header:
proxy_set_header Host $host;、proxy_set_header X-Forwarded-Proto $scheme;、proxy_set_header X-Forwarded-For $remote_addr; - 若用 Docker 启动,推荐用环境变量:
-e PMA_ABSOLUTE_URI=https://...,避免手改配置文件
什么时候你其实根本不需要 ForceSSL?
当你的 Web 服务器(Nginx/Apache)已正确终止 HTTPS,并且 PMA_ABSOLUTE_URI 已设为 HTTPS 地址时,phpMyAdmin 所有生成的链接、重定向、AJAX 请求、cookie 设置都会自然走 HTTPS——此时 $cfg['ForceSSL'] 不仅多余,还可能因协议判断失败引发静默降级或报错。
立即学习“PHP免费学习笔记(深入)”;
- 新版 phpMyAdmin(5.2+)默认不再读取
$cfg['ForceSSL'],文档里也已移除说明 - 如果你在 config.inc.php 里看到它,大概率是沿用了老模板,建议删掉或注释
- 真正要检查的是:
session.cookie_secure是否为On(PHP 配置项),以及session.cookie_httponly是否启用
最容易被忽略的一点:即使 PMA_ABSOLUTE_URI 设对了,如果 Nginx 的 proxy_redirect 没配,phpMyAdmin 内部重定向返回的 Location: http://127.0.0.1/... 仍会被浏览器执行,导致跳转到内网地址并失败——这个环节和 ForceSSL 完全无关,但常被误认为是它的问题。



















