根本原因不是“切换功能坏了”,而是phpmyadmin未正确加载多个服务器配置,因$cfg['servers']键必须为从1开始的连续整数,跳号、重复、0起始或非数字键会导致解析中断,后续配置被忽略。
根本原因不是“切换功能坏了”,而是 phpmyadmin 根本没正确加载多个服务器配置——登录下拉框只显示一个,或切换后仍连到旧实例,本质是 $cfg['servers'] 数组索引错乱或上下文污染。
为什么登录页只显示一个服务器?
phpMyAdmin 要求 $cfg['Servers'] 的键必须是从 1 开始的连续整数。任何跳号、重复、0 起始或非数字键都会导致解析中断,后续配置被忽略:
- 写死
$cfg['Servers'][1] = [...]; $cfg['Servers'][1] = [...];—— 第二个覆盖第一个 - 用
for ($i = 0; $i 然后 <code>$cfg['Servers'][$i]—— 生成[0]和[1],0被跳过 - 手动拼接
$cfg['Servers'][$db_id]且$db_id来自外部变量(如 URL 参数)—— 键不固定,易冲突 - 混用循环和硬编码:先循环生成 1–3,再单独写
$cfg['Servers'][5]—— 中间4缺失,解析在3后终止
为什么切换服务器后仍连到 localhost?
现象是下拉框有多个选项,但选中非 localhost 实例后,请求仍发往 localhost:80 或返回 token mismatch,说明 cookie/session 上下文未隔离:
- 所有实例绑在
server_name localhost—— 浏览器把所有Set-Cookie存为Domain=localhost,无法区分 -
session.cookie_domain未设或设为""—— PHP 默认不设 domain,cookie 全局可见 -
$cfg['blowfish_secret']在config.inc.php和libraries/config.default.php中不一致 —— session cookie 解密失败,token 校验直接 fallback 到空会话 - 反向代理未透传
X-Real-IP—— phpMyAdmin 用该 IP 哈希生成 token 前缀,缺失时默认用127.0.0.1,跨服务器校验必败
如何验证并修复 session 与 cookie 隔离?
关键不是“让它们工作”,而是确认每个服务器实例拥有独立的 session 存储路径和 cookie 域:
- 统一
session.save_path:所有 PHP 实例(不同 vhost)必须指向同一可写目录,如/var/lib/php/sessions,不能用/tmp - 为每个实例设独立域名:改
/etc/hosts加127.0.0.1 pmadb1.test pmadb2.test,Nginxserver_name分别设为二者 - 对应设
session.cookie_domain = ".pmadb1.test"和session.cookie_domain = ".pmadb2.test" - 检查
config.inc.php中$cfg['blowfish_secret']是否 ≥32 字符且两端完全一致(包括空格) - Nginx 配置里确认有:
proxy_set_header X-Real-IP $remote_addr;和proxy_pass_request_headers on;
最常被忽略的是:你改了 Nginx 的 server_name,却忘了同步改 PHP 的 session.cookie_domain;或者以为只要 config.inc.php 里写了 $cfg['blowfish_secret'] 就够了,没碰 libraries/config.default.php —— 这两个地方必须一模一样,否则 cookie 解密直接失败,一切 token 机制形同虚设。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











