必须删除或注释config.inc.php中对应开发服务器的整个$cfg['servers'][$i]配置区块,因hide_db仅过滤已连接实例的库名,不控制服务器列表显示;修改后须重启web服务并清opcache。

不能靠 phpMyAdmin 配置隐藏开发服务器——它只管数据库列表,不控制 MySQL 实例连接源。 你看到的“开发服务器”其实是 phpMyAdmin 配置里多加了一个 $cfg['Servers'][$i],指向了开发环境的 MySQL 地址。隐藏它的唯一方式是删掉或注释掉那段配置,不是用 hide_db 或权限控制。
为什么 $cfg['Servers'][$i] 不能用 hide_db 屏蔽
hide_db 只作用于**已连接上的 MySQL 实例内部的数据库名列表**,它对“连接哪个服务器”完全无感知。你在导航栏顶部看到的服务器下拉菜单(如 “localhost”、“dev-db-01”、“staging-mysql”),是由 $cfg['Servers'] 数组长度和 host 值决定的——每个 $cfg['Servers'][$i] 就是一个独立可选服务器入口。
- 写
$cfg['Servers'][$i]['hide_db'] = '^(dev_.*)$';不会隐藏服务器选项,只会在这个服务器连上后,过滤它里面的库名 - 试图用权限(如撤销
SHOW DATABASES)让服务器“变灰”也不行:phpMyAdmin 连接失败时直接报错,不会进导航页 - 前端 JS 禁用下拉项?不可靠,URL 手动拼
?server=2仍可强入,且新版 phpMyAdmin 已移除这类 DOM 控制逻辑
真正生效的隐藏操作:删配置 + 清缓存
打开 phpMyAdmin 根目录下的 config.inc.php,找到对应开发服务器的完整区块(从 $cfg['Servers'][$i]['host'] 开始,到下一个 $cfg['Servers'][$j] 或闭合大括号为止),整段删除或注释掉:
$cfg['Servers'][2]['host'] = 'dev-db.internal'; $cfg['Servers'][2]['port'] = '3306'; $cfg['Servers'][2]['auth_type'] = 'cookie'; // ... 其他 dev 相关配置
- 确认该区块没被其他地方复用(比如通过
include动态加载) - 如果用了宝塔、AMPPS 等集成环境,检查是否在面板后台另存了覆盖配置,需同步清理
- 修改后必须重启 Web 服务(
sudo systemctl reload apache2或sudo systemctl reload php*-fpm),仅清浏览器缓存无效 - 若开发服务器用了特殊端口或 SSL,删配置前先记下,避免后续调试失联
多人共用 phpMyAdmin 时的替代方案
如果不能删配置(例如运维和开发共用同一套 phpMyAdmin 实例),可用 IP 白名单 + 认证隔离:
- 在
$cfg['Servers'][$i]区块内加访问控制:$cfg['Servers'][$i]['AllowDeny']['order'] = 'deny,allow';和$cfg['Servers'][$i]['AllowDeny']['rules'] = array('deny % from all', 'allow % from 10.0.5.0/24'); - 确保
$cfg['Servers'][$i]['auth_type'] = 'cookie';,避免 HTTP Basic 认证绕过 IP 检查 - 白名单只放开发网段,运维人员访问时因 IP 不匹配,下拉菜单中该服务器条目自动消失(phpMyAdmin 5.2+ 默认行为)
- 注意:Nginx 用户需在
location块中透传真实 IP,否则AllowDeny判的是反向代理地址
最易被忽略的一点:phpMyAdmin 的服务器列表是 PHP 启动时读取配置生成的,没有运行时开关。改完不重启服务,等于没改;删了配置却忘了清 PHP OPcache(尤其启用了 opcache.enable_cli=1 的场景),旧配置仍可能残留执行。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











