phpMyAdmin 不自动感知 HTTPS,必须显式配置 PMA_ABSOLUTE_URI 环境变量或 $cfg['PmaAbsoluteUri']、透传 X-Forwarded-Proto 头、设置 proxy_redirect 及 Cookie Secure 属性,否则因协议不匹配导致跳转错误和“Failed to set session cookie”。

phpMyAdmin 本身不自动感知 HTTPS,必须显式配置协议和跳转逻辑,否则会持续跳 HTTP、报 Failed to set session cookie 错误。
为什么 $cfg['ForceSSL'] 不起作用?
新版 phpMyAdmin(5.2+)已移除 $cfg['ForceSSL'] 配置项;即使旧版存在,它仅影响登录表单的 action 地址,不修正重定向响应头、JS 请求 URL 或 Cookie 的 Secure 属性。真正起效的是协议感知 + 绝对 URI 控制。
- 若 Nginx/Apache 反向代理后未透传
X-Forwarded-Proto,$_SERVER['HTTPS']仍为off,phpMyAdmin 拒绝设 Secure Cookie - 仅靠
return 301 https://...无法解决 phpMyAdmin 内部生成的跳转地址(如登录后跳http://localhost/.../main.php) - 浏览器收到含
http://的Location响应头,直接跳内网或 404,不经过你的 Nginx 重写
必须设置 PMA_ABSOLUTE_URI 环境变量
这是最可靠、侵入性最小的方案,尤其适用于 Docker 或宝塔等托管环境。它强制 phpMyAdmin 所有 URL(表单 action、AJAX 接口、重定向目标)都基于该值生成,彻底绕过协议探测逻辑。
- Docker 启动时加参数:
docker run -e PMA_ABSOLUTE_URI=https://yourdomain.com/phpmyadmin/ -e PMA_HOST=db ... - 宝塔用户:在「数据库 → phpMyAdmin 设置」中勾选「允许通过 HTTPS 访问」,本质就是后台注入了该变量
- 手动部署:在
config.inc.php开头插入:if (getenv('PMA_ABSOLUTE_URI')) {<br> $cfg['PmaAbsoluteUri'] = getenv('PMA_ABSOLUTE_URI');<br>} - 注意末尾斜杠:
https://example.com/phpmyadmin/✅,https://example.com/phpmyadmin❌(会导致子路径资源 404)
Nginx 反向代理必须补全三要素
仅 proxy_pass 不够。phpMyAdmin 在生成跳转时依赖 Host 和协议信息,漏掉任一 header 都可能拼出 http://localhost/login 这类地址。
-
proxy_set_header Host $host;—— 用原始 Host,不用$http_host(后者可能带:80) -
proxy_set_header X-Forwarded-Proto $scheme;—— 让后端知道真实协议 -
proxy_set_header X-Forwarded-For $remote_addr;—— 日志和限流需真实 IP - 必须加
proxy_redirect ~^https?://[^/]+(/.*)$ $scheme://$host$1;,否则 phpMyAdmin 返回的绝对跳转地址不会被重写
Cookie 安全属性和 HSTS 要配套启用
即使跳转和 URL 正确,浏览器仍可能因 Cookie 缺少 Secure 标志而拒绝设置,触发 Failed to set session cookie 提示。
- 在
config.inc.php中添加:$cfg['CookieSameSite'] = 'Strict';<br>$cfg['LoginCookieRecall'] = true;<br>// 若用反向代理,确保 session.cookie_secure = On 在 php.ini 中生效
- Nginx HTTPS server 块中加:
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; - 不要在 HTTP server 块里加 HSTS header —— 浏览器会忽略
- HSTS 不能替代 301 跳转,两者必须共存:301 解决首次访问,HSTS 解决后续所有访问
最容易被忽略的是 PMA_ABSOLUTE_URI 和 proxy_redirect 的组合 —— 少一个,phpMyAdmin 就会固执地生成错误协议的跳转地址,且前端完全无报错提示,只表现为无限重定向或空白页。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











