phpMyAdmin 子目录部署需精确配置 Nginx:用 alias 映射路径,手动设置 SCRIPT_FILENAME,配置 PmaAbsoluteUri 和 blowfish_secret,确保 PHP-FPM 可访问且权限正确。
phpMyAdmin 不能直接放在 /var/www/html/phpmyadmin 就完事
很多人解压后把 phpmyadmin 放进 nginx 默认根目录的子文件夹,比如 /var/www/html/phpmyadmin,然后访问 http://example.com/phpmyadmin/ —— 页面能加载,但点登录就 404 或跳转到根路径,index.php 不执行。根本原因是:nginx 的 location ~ \.php$ 规则默认只匹配 uri 根路径下的 php 文件,不自动适配子目录层级,且 script_filename 构造错误。
location 必须显式声明子目录路径并重写 fastcgi_param SCRIPT_FILENAME
关键不是“加个 alias”就完事——alias 和 root 在 PHP 场景下行为差异极大,用错会导致 File not found 错误。正确做法是用 location 精确匹配子路径,并手动拼出正确的脚本绝对路径:
- 把 phpMyAdmin 解压到独立目录,例如
/usr/share/phpmyadmin(推荐系统级位置,避免和站点代码混在一起) - 在 server 块中添加如下配置(以挂载到
/pma为例):location /pma/ { alias /usr/share/phpmyadmin/; index index.php; location ~ \.php$ { if ($fastcgi_script_name ~ ^/pma/(.+\.php)$) { set $valid_fastcgi_script_name $1; } fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /usr/share/phpmyadmin/$valid_fastcgi_script_name; include fastcgi_params; } location ~ /\.ht { deny all; } } - 必须用
alias(不是root),因为alias会把/pma/xxx映射为/usr/share/phpmyadmin/xxx;而root会拼成/usr/share/phpmyadmin/pma/xxx,路径多了一层 -
SCRIPT_FILENAME不能依赖$document_root$fastcgi_script_name,它会把/pma/index.php拼成/usr/share/phpmyadmin/pma/index.php—— 错了。必须提取真实文件名再拼接
config.inc.php 里要设 $cfg['PmaAbsoluteUri']
否则登录后跳转地址仍是根域(如 http://example.com/index.php),而不是 http://example.com/pma/index.php,导致反复重定向或 CSRF 报错:
- 编辑
/usr/share/phpmyadmin/config.inc.php - 加入这一行(注意末尾斜杠):
$cfg['PmaAbsoluteUri'] = 'http://example.com/pma/';
- 如果启用了 HTTPS,必须写
https://,否则登录表单提交会被浏览器拦截 - 若用反向代理(如 Cloudflare),还要加
$cfg['ForceSSL'] = true;,否则PmaAbsoluteUri可能被忽略
常见报错与绕不开的坑
部署后遇到白屏、502、404 或 “Cannot start session without errors”,大概率卡在这几个点:
-
502 Bad Gateway:PHP-FPM 没监听127.0.0.1:9000,或 SELinux 阻断了 socket(CentOS/RHEL 上运行setsebool -P httpd_can_network_connect 1) -
File not found:SCRIPT_FILENAME拼错了路径,或/usr/share/phpmyadmin/目录权限不对(Nginx worker 进程用户,如www-data或nginx,必须有读+执行权限) - 登录后跳回
/或提示 “#2002 Cannot log in to the MySQL server”:MySQL 连接配置没改,默认连localhost,Docker 或远程 DB 需在config.inc.php中显式设置$cfg['Servers'][$i]['host'] = 'your-db-host'; - 页面底部提示 “configuration file now needs a secret passphrase”:必须填
$cfg['blowfish_secret'],长度至少 32 字符,用openssl rand -base64 32生成最稳妥
子目录部署最难的部分不在安装,而在路径映射的精确性——少一个斜杠、多一层目录、漏掉 alias 的末尾斜杠,都会让整个流程卡死。别跳过测试每个链接是否返回 200 和可执行 PHP。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











