登录 Server B 跳回 Server A 是因同域下 phpMyAdmin 实例共享 cookie 导致会话混用,需为每个实例配置独立 cookie_path、session.cookie_domain 和 blowfish_secret,并确保服务器索引连续、session 路径统一及 token 上下文一致。
为什么登录 Server B 会跳回 Server A?
这不是界面 bug,而是浏览器把两个 phpmyadmin 实例的 cookie 当成同一份在用。只要它们同域(比如都绑在 localhost 或同一子域名下),phpmyadmin 生成的 session cookie 就会互相覆盖——你输完 server b 的密码,浏览器顺手把 server a 的旧 cookie 发过去,后端解密后直接连上 a。
常见现象包括:登录页一闪而过、数据库列表页显示的是另一个服务器的内容、反复登出又自动重登。
- 必须让每个实例有独立的
cookie_path,例如/phpmyadmin-a/和/phpmyadmin-b/ - 不能全用
localhost;改/etc/hosts加真实域名如127.0.0.1 pmadb1.test,Nginx 配置里设server_name pmadb1.test -
session.cookie_domain要设为.pmadb1.test(注意开头的点),而不是localhost或空值
$cfg['blowfish_secret'] 写错会导致凭据混用
这个密钥不是“设一次就行”的全局开关。它参与加密 cookie 中的用户名和密码,如果两个服务器共用同一个 $cfg['blowfish_secret'],那 Server A 的加密凭证就能被 Server B 解开——等于凭据裸奔。
错误做法:在 config.inc.php 顶部写一个密钥,然后所有 $cfg['Servers'][$i] 都复用它。
- 每个服务器块必须配独立的
$cfg['blowfish_secret'],长度 ≥32 字符,用openssl rand -base64 32生成最稳妥 - 密钥必须同时出现在
config.inc.php和libraries/config.default.php中,且完全一致;否则解密失败,cookie 被丢弃 - 别用简单字符串如
"123456"或日期,会被暴力破解
服务器数组索引断裂会让配置静默失效
phpMyAdmin 解析 $cfg['Servers'] 时,只认从 1 开始连续的整数键。如果你写了 [1] 和 [3],中间漏掉 [2],它会停在 [1] 就不再往后读——后面所有服务器都不生效,但也不报错。
立即学习“PHP免费学习笔记(深入)”;
典型错误:手动复制粘贴时忘了改索引,或者用 foreach 但没初始化 $i = 0 导致第一个服务器写到 [0] 被忽略。
- 用官方推荐的循环模式:
$i = 0; foreach ($servers as $s) { $i++; $cfg['Servers'][$i]['host'] = $s['host']; ... } - 检查最终生成的
$cfg['Servers']数组,用print_r($cfg['Servers']); die;确认键是1, 2, 3...连续整数 - 别在配置里混用硬编码索引和动态索引,比如先写
$cfg['Servers'][1] = [...],再用循环从$i=1开始赋值,后者会覆盖前者
Token mismatch 不是多服务器专属问题,但会放大配置漏洞
token 校验失败本身不源于多服务器,但它会暴露 session 和 cookie 的上下文错配。比如你切到 Server B 后,PHP 仍从 Server A 的 session 存储路径读 session 文件,或反向代理没透传 X-Real-IP,导致 token 哈希前缀对不上。
表现是:选完服务器点登录,立刻弹 “Token mismatch”,甚至刷新页面就登出。
- 所有实例必须共用同一
session.save_path(如/var/lib/php/sessions),且该目录对 Web 用户可读写 - Nginx 需启用
proxy_pass_request_headers on;,并设置proxy_set_header X-Real-IP $remote_addr; - 确认
$cfg['Servers'][$i]['auth_type']全部设为'cookie';混用'http'会导致部分请求绕过 token 校验流程,破坏一致性
cookie_path 和 session.cookie_domain 的配合——光改路径不改域名,或光改域名不设路径,都会让隔离失效。这两个值必须和 Web 服务器路由严格对齐,少一个环节,cookie 就照常打架。



















