必须在Nginx的location ^~ /phpMyAdmin/块中配置auth_basic与auth_basic_user_file,并放行/js/、/css/等静态资源路径,同时确保.htpasswd文件由htpasswd工具生成、权限为640、属组匹配Web服务用户,且仅在HTTPS下启用以保障凭证安全。
直接在 location 块里配 auth_basic,别动 phpMyAdmin 本身
不用改 phpmyadmin 源码、不装插件、不碰数据库权限,nginx 层加一层 http basic auth 就够了。关键是把认证范围精准卡死在 /phpmyadmin/(注意结尾斜杠),避免误拦 /phpmyadmin/ 或静态资源。
-
location ^~ /phpMyAdmin/比location /phpMyAdmin/更可靠:前者是前缀匹配且优先级高于正则,不会被后续location ~ \.php$规则意外覆盖 - 如果 phpMyAdmin 实际部署在子路径(如
/pma/),必须同步改 location 路径,否则 401 会出现在错误位置 - 不要在 server 块顶层配
auth_basic,否则整个站点都弹登录框
htpasswd 文件必须用标准工具生成,不能手写或复制密码串
浏览器发送的是 Base64 编码的 username:password,但 Nginx 不校验 Base64,而是比对 htpasswd 文件里 crypt 或 apr1 加密后的哈希值。手写明文或粘贴别人给的 hash 字符串基本等于裸奔。
- Ubuntu/Debian:运行
sudo apt install apache2-utils -y - CentOS/RHEL:运行
sudo yum install httpd-tools -y或dnf install httpd-tools - 首次创建:执行
sudo htpasswd -c /etc/nginx/.htpasswd admin(会交互输入密码) - 追加用户:去掉
-c,例如sudo htpasswd /etc/nginx/.htpasswd devops - 文件权限必须是
640,属主 root,属组 nginx 或 www-data:sudo chmod 640 /etc/nginx/.htpasswd && sudo chown root:www-data /etc/nginx/.htpasswd
放行静态资源,否则 CSS/JS 加载失败导致界面空白
phpMyAdmin 页面依赖 /phpMyAdmin/js/、/phpMyAdmin/css/ 等路径下的静态文件。如果这些请求也被 auth 拦住,页面会加载不全甚至白屏,但错误日志里只显示 401,容易误判为权限问题。
- 在
location ^~ /phpMyAdmin/外部单独配一个更具体的静态资源 location: location ^~ /phpMyAdmin/js/ { auth_basic off; }location ^~ /phpMyAdmin/css/ { auth_basic off; }location ^~ /phpMyAdmin/images/ { auth_basic off; }- 或者统一用
location ^~ /phpMyAdmin/(js|css|images)/正则前缀匹配(注意 Nginx 不支持括号分组用于匹配,所以得拆开写或用~*,但优先级需留意)
HTTPS 下才真正安全,HTTP 上传的账号密码是明文
Basic Auth 的凭证在 HTTP 协议里是 base64 编码后放在 Header 的 Authorization: Basic xxx 字段里——base64 不是加密,只是编码,抓包就能还原。没开 HTTPS,等于把密码贴在网线上传。
- 确认 server 块监听
443 ssl,且有有效证书(自签证书也会触发浏览器警告,但至少加密了传输) - 强制跳转 HTTPS:在 HTTP server 块里加
return 301 https://$host$request_uri; - 检查浏览器地址栏锁图标是否点亮,没点亮就别信“已登录”
sudo nginx -t && sudo systemctl reload nginx。最容易漏的是静态资源没放行,以及 .htpasswd 权限不对导致 worker 进程读取失败——这时 error log 里会出现 open() "/etc/nginx/.htpasswd" failed (13: Permission denied)。



















