必须设置$cfg['blowfish_secret']且长度≥32字节,否则AES-256加密失败导致登录后秒退或报“配置文件需要绝密短语密码”;该密钥仅加密会话token,不参与密码传输,且必须置于$cfg['Servers']配置之前、config.inc.php与config.default.php中一致。
必须设置 $cfg['blowfish_secret'] 且长度 ≥32 字符,否则登录后立刻跳回登录页或报“配置文件现在需要绝密的短语密码”错误。
为什么登录后秒退?$cfg['blowfish_secret'] 长度不够或配置错位置
cookie 认证依赖 AES-256 加密会话 token,$cfg['blowfish_secret'] 就是密钥。PHPMyAdmin 要求它至少 32 字节(不是字符数,而是字节长度),常见错误包括:
- 用
bin2hex(random_bytes(16))生成 32 字符,但没校验是否含非 ASCII 字符导致实际字节数不足 - 复制时带中文引号、前后空格或换行
- 只改了
config.inc.php,却漏掉libraries/config.default.php中同名变量(某些旧版本仍会读取此处) - 把
$cfg['blowfish_secret']写在if块里,条件不满足时未执行
验证方式:在 PHP 中运行 echo strlen($cfg['blowfish_secret']);,输出必须 ≥32。
$cfg['Servers'][$i]['auth_type'] = 'cookie' 时,user 和 password 字段要不要填?
完全不用填,也不该填。在 cookie 模式下,phpMyAdmin 会忽略 $cfg['Servers'][$i]['user'] 和 $cfg['Servers'][$i]['password'] 的值——哪怕你写了 'root' 和 '123456',它也不会拿去连 MySQL。
- 用户输入的账号密码每次都是实时传给 MySQL 服务端做原生认证
- 填了反而误导维护者,以为凭据生效;还可能被误提交到 Git 或日志中
- 务必设
$cfg['Servers'][$i]['AllowNoPassword'] = false,防止空密码直连
正确写法示例:
立即学习“PHP免费学习笔记(深入)”;
$cfg['Servers'][1]['auth_type'] = 'cookie'; $cfg['Servers'][1]['host'] = '192.168.1.10'; $cfg['Servers'][1]['port'] = '3306'; $cfg['Servers'][1]['user'] = ''; $cfg['Servers'][1]['password'] = ''; $cfg['Servers'][1]['AllowNoPassword'] = false;
多服务器共存时,为什么总连错?$cfg['blowfish_secret'] 复用 + 缺少路径隔离
同一域名下多个 phpMyAdmin 实例(如 /phpmyadmin-a/ 和 /phpmyadmin-b/)若共用 $cfg['blowfish_secret'],浏览器 cookie 会被覆盖或误解析,导致登录 Server B 后跳回 Server A 的库列表。
- 每个实例必须配独立的
$cfg['blowfish_secret'](建议用openssl rand -base64 32生成) - Web 服务器需将各实例部署在不同 URL 路径下(如
/phpmyadmin-prod/、/phpmyadmin-dev/) - 在
config.inc.php中显式设置$cfg['cookie_path'] = '/phpmyadmin-prod/';,与实际路径一致 - 确认
$cfg['Servers'][$i]['host']和$cfg['Servers'][$i]['port']填的是目标 MySQL 地址,不是localhost(除非 MySQL 真在同机且监听 127.0.0.1)
最易被忽略的一点:MySQL 用户的 Host 字段必须匹配 phpMyAdmin 所在服务器的出口 IP。例如 phpMyAdmin 运行在 192.168.1.5,而你配置了 $cfg['Servers'][1]['host'] = '192.168.1.10',那 MySQL 侧就必须存在 admin@'192.168.1.5' 或 admin@'%',否则报 #1045 Access denied——这和 phpMyAdmin 配置无关,但现象一模一样。



















