根本原因是$cfg['servers']数组键必须从1开始连续整数,手动写死索引或动态拼接会导致覆盖,仅最后一个服务器生效,登录下拉框只显示一个实例且Cookie错配。
phpMyAdmin多服务器配置中$cfg['servers']索引冲突导致Cookie混用
根本问题不是cookie本身出错,而是phpmyadmin把所有服务器配置塞进同一个全局数组 $cfg['servers'],而这个数组的键必须是**从1开始、连续、不重复的整数**。一旦你手动写死 $i = 1 然后反复赋值,或者用外部变量动态拼接,后续配置就会覆盖前面的——比如 $cfg['servers'][1] 被第二次赋值冲掉,只剩最后一个服务器能显示在登录下拉框里。
现象是:界面只列出一个服务器,或登录后跳转到错误实例;抓包会发现请求发到了 localhost:80 却带上了本该只属于 db-prod.example.com 的 Cookie。
- 不要在 config.inc.php 里写
$cfg['servers'][1] = [...]; $cfg['servers'][1] = [...];(后者覆盖前者) - 不要混合使用
for ($i=1; $i 和硬编码 <code>$cfg['servers'][3],索引断裂会导致 phpMyAdmin 解析中断 - 官方示例
config.manyhosts.inc.php用循环+递增$i是唯一被验证可靠的模式
localhost 多站点共用时浏览器强制共享 Cookie
当你在 phpEnv 或本地 Nginx 中把多个 phpMyAdmin 实例都绑到 server_name localhost,浏览器会把所有 Set-Cookie 视为 Domain=localhost 存储——而 localhost 不支持子域隔离,sitea.localhost 和 siteb.localhost 的 Cookie 在底层是同一份。
结果就是:你在 A 站点登录后生成的 phpMyAdmin_abc123 session cookie,会被自动带上发给 B 站点的请求,后端收到混乱的 session ID,直接拒绝或静默降级。
- 修改系统
/etc/hosts,添加真实域名如127.0.0.1 pmadb1.test pmadb2.test - 每个站点 Nginx 配置里改
server_name pmadb1.test,并同步更新 PHP 的session.cookie_domain = ".pmadb1.test" - 别碰
proxy_cookie_domain localhost,浏览器根本不认Domain=localhost
config.inc.php 和 config.default.php 的 blowfish_secret 不一致
phpMyAdmin 用 $cfg['blowfish_secret'] 加密 session cookie 内容。这个密钥必须在两个地方完全一致:config.inc.php(主配置)和 libraries/config.default.php(核心库默认值)。只要有一处为空、或值不同,解密失败,session cookie 就无法被识别——表现就是“必须启用 Cookies 才能登录”,或者登录后立刻失效。
注意:密钥长度至少 32 字符,不能是简单单词;且 config.default.php 文件常被忽略,但它在 session 初始化阶段早于 config.inc.php 被加载。
- 检查两处
$cfg['blowfish_secret']是否完全相同(包括空格、大小写) - 确认
config.default.php没被权限锁死(PHP 进程需有读取权限) - 避免用
md5(time())类动态值,必须是静态字符串
auth_type = 'cookie' 但 PHP session 未正常写入
phpMyAdmin 默认用 auth_type = 'cookie',这意味着它依赖 PHP 的原生 session 机制存用户凭证。如果 session.save_path 不可写、session.auto_start = on 干扰了流程、或 PHP-FPM 用户没权限访问 session 目录,就会出现 “Failed to set session cookie” 错误,浏览器收不到 Set-Cookie 响应头。
典型现象:登录页提交后无跳转,network 面板里 index.php 返回 200 但响应体为空,或报 500 错误。
- 运行
php -r "echo session_save_path();"查路径,再ls -ld看是否可写 - 确认
php.ini中session.auto_start = off(phpMyAdmin 要自己调session_start()) - 检查
phpinfo()页面里的Loaded Configuration File是否是你以为的那个文件
$cfg['servers'] 索引,但 blowfish_secret 不一致,仍看不到多服务器列表;或者 hosts 域名配对了,但 session.save_path 权限不对,登录态还是留不住。排查时得按层来——先确保单个实例能稳定登录,再加第二个。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











