Nginx 为 phpMyAdmin 配置 HTTP 基础认证需正确生成 htpasswd 文件(推荐 htpasswd -b -m 或 openssl passwd -apr1)、隔离 auth_basic 与 PHP 解析(用 ^~ + 内嵌 location ~ .php$)、禁用 config.inc.php 中的 auth_type = 'http',否则将导致 403/502 或无限弹窗。

直接在 location 块里加 auth_basic 和 auth_basic_user_file 就能生效,但必须避开 phpMyAdmin 的 PHP 解析冲突——否则会触发 403、502 或无限弹窗循环。
先生成正确的 htpasswd 文件
密码文件格式是 用户名:加密密码,每行一个用户。别用在线工具生成的明文 SHA(如 user:{SHA}...),Nginx 不认;也别用 openssl passwd -crypt,它生成的是弱 CRYPT,现代 Nginx 默认拒绝。
- 推荐命令:
htpasswd -b -m /etc/nginx/conf.d/phpmyadmin.htpasswd admin 123456(-m强制 MD5,兼容性好) - 若没装
htpasswd,用:printf "admin:$(openssl passwd -apr1 123456)\n" > /etc/nginx/conf.d/phpmyadmin.htpasswd(-apr1是 Apache 风格 MD5,Nginx 支持) - 生成后检查权限:
chmod 400 /etc/nginx/conf.d/phpmyadmin.htpasswd,且确保 Nginx 主进程能读(如属主为root,组为nginx)
location 配置必须隔离认证与 PHP 解析
常见错误是把 auth_basic 和 fastcgi_pass 写在同一个 location 下,导致 Nginx 先要求认证、再转发 PHP 请求时丢失原始认证头,phpMyAdmin 自己又跳登录页,形成双认证死循环。
- 正确做法:用
^~前缀匹配整个路径,再在内部嵌套location ~ \.php$单独处理 PHP - 示例配置片段:
location ^~ /phpmyadmin/ {
auth_basic "phpMyAdmin Access";
auth_basic_user_file /etc/nginx/conf.d/phpmyadmin.htpasswd;
alias /usr/share/phpmyadmin/;
index index.php;
location ~ \.php$ {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $request_filename;
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
fastcgi_intercept_errors on;
}
}
注意:alias 结尾必须带斜杠,且不能和 root 混用;SCRIPT_FILENAME 用 $request_filename 而非 $document_root$fastcgi_script_name,避免路径拼错。
立即学习“PHP免费学习笔记(深入)”;
绕开 phpMyAdmin 的 http 认证模式
千万别在 phpMyAdmin 的 config.inc.php 里设 $cfg['Servers'][$i]['auth_type'] = 'http';。这个模式依赖 Apache 的 mod_auth 行为,Nginx 不提供等价的 PHP 环境变量透传(如 PHP_AUTH_USER),会导致登录后反复跳回认证框或报错 #2002 Cannot log in to the MySQL server。
- 保持 phpMyAdmin 使用默认的
cookie认证方式即可 - Nginx 层的
auth_basic只做第一道门,用户通过后,phpMyAdmin 再走自己的 session 登录流程 - 如果已误配,删掉 config 里的
auth_type行,或注释掉整段 Server 配置再重试
最易被忽略的是 fastcgi_param SCRIPT_FILENAME 的构造方式和 auth_type = 'http' 的干扰——这两点不处理,哪怕密码文件和 location 写对了,也会卡在无限弹窗或 502 上,而不是配置“没生效”。



















