切换多服务器触发“Cookie size exceeded”错误,因phpMyAdmin将各服务器认证凭据追加写入同一cookie且不自动清理,超4KB浏览器拒绝设置;需启用$cfg['LoginCookieDeleteAll']=true、禁用LoginCookieStore、精简host等配置并清空旧cookie。

为什么切换多服务器后会触发“Cookie size exceeded”错误
phpMyAdmin 每次连接一个服务器,都会在 phpMyAdmin 这个 cookie 里存入该服务器的认证凭据(加密后的 host/port/user 等),而这些凭据是追加式写入、不自动清理旧条目的。当你频繁切换 5 个以上服务器,或某些服务器配置了长 host 名(如带端口的 172.18.0.2:3307)、长用户名、或启用了 $cfg['LoginCookieStore'] = 1(强制浏览器持久化),cookie 很快就会突破 4KB 上限,浏览器直接拒绝设置,页面卡在登录页或报错 “Cookie size exceeded”。
如何定位当前 cookie 是否已超载
打开浏览器开发者工具 → Application → Cookies → 找到域名下的 phpMyAdmin cookie → 点开看 “Value” 字段长度。如果超过 3900 字符,基本就是它了。再检查 Network 面板中任意一次登录请求的响应头:Set-Cookie: phpMyAdmin=... 如果值异常长(远超 1000 字符),说明凭据已堆积。
- 不要只看 config.inc.php 里写了几个
$cfg['Servers']—— 实际写入 cookie 的是用户**操作过**的服务器,不是配置数 - 宝塔面板下多个子域名站点(如
pm1.example.com和pm2.example.com)各自维护独立 cookie,互不影响,但单个站点内切换太多服务器仍会超限 - 使用
$cfg['AllowArbitraryServer'] = true手动输入地址,每次提交都新增一条记录,比下拉选择更易撑爆 cookie
立即生效的压缩与清理方案
根本解法不是“增大 cookie 限制”(浏览器不允许),而是减少单个 cookie 承载的数据量。以下三步必须同时做:
- 在
config.inc.php中添加:$cfg['LoginCookieDeleteAll'] = true;—— 登录新服务器时,主动清空之前所有服务器的凭据,只保留当前一条 - 禁用冗余存储:
$cfg['LoginCookieStore'] = 0;(默认值,确保不强制浏览器写死 cookie) - 缩短凭据内容:把所有
$cfg['Servers'][$i]['host']改为 IP 或短域名(如用db1代替mysql-prod-vpc-az1.internal.example.com:3306),避免端口明写(改用$cfg['Servers'][$i]['port']单独配)
改完后务必清空浏览器中该域名下的所有 phpMyAdmin cookie,否则旧数据仍在,新逻辑不生效。
立即学习“PHP免费学习笔记(深入)”;
长期避免复发的关键配置
仅靠 $cfg['LoginCookieDeleteAll'] = true 不够稳——它只在登录时清理,如果用户反复点“重新登录”或刷新登录页,可能因 session 复用导致凭据残留。真正可靠的组合是:
-
$cfg['SessionForceNew'] = true;(强制每次登录生成全新 session ID,切断旧凭据链) -
session.use_strict_mode = 1(PHP 配置项,防止攻击者传入无效 SID 绕过清理) -
$cfg['blowfish_secret']必须是 32 字符以上随机字符串(太短会导致加密后凭据膨胀)
注意:$cfg['SessionForceNew'] = true 在 phpMyAdmin 5.2.2+ 才真正生效,且必须配合成功认证后的 session_regenerate_id(true) 调用 —— 这部分由代码内置,你只需确保没被自定义 hook 屏蔽。



















