必须先让整个站点能稳定走HTTPS,再开$cfg['ForceSSL']=true;否则直接报“Access denied: insecure connection”,这说明ForceSSL已生效但Web服务器未透传X-Forwarded-Proto或HTTPS头,导致PHP误判协议。
必须先让整个站点能稳定走 https,再开 $cfg['forcessl'] = true;否则直接报 “access denied: insecure connection”——这不是配置失败,而是 phpmyadmin 主动拦住了 http 请求。
为什么开了 ForceSSL 却报 “Access denied: insecure connection”
这个错误说明 $cfg['ForceSSL'] 已生效,但 PHP 拿到的请求协议仍是 http。根本原因不是证书没配,而是 Web 服务器没把真实协议头透传给 PHP。
- Nginx 反代时,漏了
proxy_set_header X-Forwarded-Proto $scheme;或fastcgi_param HTTPS on; - Apache 用户没启用
mod_ssl,或虚拟主机里漏了SSLEngine on - 用了 CDN 或负载均衡,但没在 Nginx/Apache 中补全
X-Forwarded-Proto头,导致 phpMyAdmin 读到的是http - 证书本身无效(比如自签名、域名不匹配),浏览器根本没发请求过去——这时看到的是
ERR_SSL_PROTOCOL_ERROR,和 ForceSSL 无关
Nginx 下 HTTPS 透传必须加的两行
如果你用 Nginx 反代到 PHP-FPM(最常见场景),仅靠监听 443 端口和配证书是不够的:$cfg['ForceSSL'] 不看端口,只看 PHP 能否确认当前是 HTTPS。
- 在
location /phpmyadmin块里必须加:fastcgi_param HTTPS on; - 同时保留:
proxy_set_header X-Forwarded-Proto $scheme;(旧版 phpMyAdmin 依赖它) - 别手动写
return 301 https://...,否则和 phpMyAdmin 自带的跳转逻辑冲突,引发无限重定向 - 禁用
alias指向 phpMyAdmin 目录;改用root+try_files或直连fastcgi_pass
Apache 用户最容易漏的三个点
Apache 的处理链比 Nginx 更隐性,出问题常卡在模块或虚拟主机配置层面。
-
mod_ssl必须已启用:a2enmod ssl,且重启 Apache - 对应虚拟主机(
<VirtualHost *:443>)中必须有SSLEngine on,缺一不可 - 确保
ssl_certificate和ssl_certificate_key路径正确、权限可读(如www-data要能打开) - 如果 phpMyAdmin 部署在子路径(如
/pma/),还要额外设$cfg['PmaAbsoluteUri'] = 'https://example.com/pma/';,否则重定向会拼出 HTTP 地址
宝塔面板用户别硬套独立子域名
宝塔的 phpMyAdmin 是嵌入式代理架构,不是独立网站。试图用 phpmyadmin.example.com 配 HTTPS 直连,大概率 403/502/空白页——因为它绕过了宝塔的 Token 校验、Referer 白名单和 Session 路径控制。
立即学习“PHP免费学习笔记(深入)”;
- 正确做法:主站(如
example.com)先配好 SSL 证书 - 进宝塔 → 数据库 → phpMyAdmin 设置 → 勾选「允许通过 HTTPS 访问」
- 检查生成的 Nginx 配置里是否有
location /phpmyadmin代理块,且含proxy_set_header X-Forwarded-Proto $scheme; - 不要 symlink 或 alias 到网站目录,会暴露
config.inc.php且破坏 Session 存储
ForceSSL 的本质是“协议校验开关”,不是“HTTPS 启动器”。它不处理证书、不跳转、不修 header——所有前置条件都得由 Web 服务器兜底。最容易被忽略的,是反代场景下 X-Forwarded-Proto 和 HTTPS 两个参数没同步设置,结果 phpMyAdmin 一半逻辑认 HTTPS,一半认 HTTP,行为就不可预测了。



















