alias配置/phpmyadmin易导致PHP文件下载,因SCRIPT_FILENAME拼接错误;需显式指定绝对路径并用if提取真实脚本名;session目录权限须匹配PHP-FPM用户;blowfish_secret不能为空。
直接用 alias 配置 /phpmyadmin 路径是最常用也最易出错的方式——不是不能用,而是稍有疏漏就会触发 php 文件下载、404 或 session 失败。
为什么 alias /phpmyadmin 会下载 .php 文件?
本质是 SCRIPT_FILENAME 拼接错误:Nginx 的 alias 不像 root 那样自动补全路径,fastcgi_param SCRIPT_FILENAME 必须手动指向真实磁盘路径,且不能依赖 $document_root(它在 alias 下不生效)。
- 典型错误配置:
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;→$document_root是空或错的,最终传给 PHP-FPM 的是类似/var/www/html/phpmyadmin/index.php这种根本不存在的路径 - 结果:PHP-FPM 找不到文件,Nginx 回退为静态文件响应,浏览器看到
Content-Type: application/octet-stream,直接下载index.php - 正确做法:必须显式写死 phpMyAdmin 的绝对路径,例如
/usr/share/phpMyAdmin/或/home/www/phpmyadmin/
location ~ /phpmyadmin/.+\.php$ 中的 if + set 是干啥的?
这是为了解决 alias 下 $fastcgi_script_name 带前缀(如 /phpmyadmin/index.php)导致 PHP-FPM 解析失败的问题。Nginx 不会自动剥离 /phpmyadmin/ 前缀,而 PHP-FPM 期望的是相对路径(如 index.php)。
-
if ($fastcgi_script_name ~ /phpmyadmin/(.+\.php.*)$)提取真实脚本名 -
set $valid_fastcgi_script_name $1;把/phpmyadmin/index.php变成index.php - 后续
SCRIPT_FILENAME拼接时用/your/path/$valid_fastcgi_script_name,而非$document_root$fastcgi_script_name - 注意:
if在 location 内是安全的,但不要在 server 或 http 级别滥用
session.save_path 权限和路径必须匹配 PHP-FPM 用户
访问 phpMyAdmin 时出现 Cannot start session without errors,90% 是因为 session 目录不可写或属主不对。
- 先查 PHP 实际使用的
session.save_path:php -i | grep session.save_path - 常见路径:
/var/lib/php/session(Debian/Ubuntu)、/var/lib/php/session(CentOS/RHEL),但不同 PHP 版本或安装方式可能不同 - 创建目录(如果不存在):
sudo mkdir -p /var/lib/php/session - 属主必须和 PHP-FPM 进程用户一致:
ps aux | grep 'php-fpm' | head -2查看 worker 用户(通常是www-data或nginx或apache) - 赋权:
sudo chown www-data:www-data /var/lib/php/session(替换成你实际的用户) - 权限建议:
sudo chmod 1733 /var/lib/php/session(sticky bit + rwx for group)
blowfish_secret 为空会导致登录页报错
phpMyAdmin 启动后底部提示 The configuration file now needs a secret passphrase,说明 config.inc.php 里 $cfg['blowfish_secret'] 没设或为空。
立即学习“PHP免费学习笔记(深入)”;
- 进入 phpMyAdmin 目录,复制模板:
cp config.sample.inc.php config.inc.php - 生成 32 字符随机密钥:
openssl rand -base64 32 - 编辑
config.inc.php,找到$cfg['blowfish_secret'] = '';,填入密钥:$cfg['blowfish_secret'] = 'kVu/yTa5dzkIJiYHrDppvnU+y8LCLf6XkpoldsCMfFQ='; - 密钥只需设一次,无需定期更换;但不能留空,也不能用简单字符串(如
'123')
最关键的细节往往藏在 fastcgi_param SCRIPT_FILENAME 的拼写和路径是否真实存在——多检查一遍磁盘路径、用户权限、以及 php-fpm.sock 或 127.0.0.1:9000 是否与你的 PHP-FPM 配置完全一致。



















