phpmyadmin的fastcgi配置不能直接套用php通用配置,因其子目录访问(如/phpmyadmin/setup)需显式映射到index.php并正确拆分path_info,否则触发“no input file specified”;script_filename必须用$request_filename配合alias,且client_max_body_size与php的post_max_size/upload_max_filesize须同步调大。

phpMyAdmin的FastCGI配置为什么不能直接套用PHP通用配置
因为 phpMyAdmin 是纯 PHP 脚本集合,不依赖框架路由,但对 SCRIPT_FILENAME、PATH_INFO 和上传限制极其敏感。Nginx 默认的 fastcgi_params 会把请求路径原样传给 PHP-FPM,而 phpMyAdmin 的子目录访问(如 /phpmyadmin/setup)或 URL 中带点号(.php 后缀被重写)时,容易触发 File not found 或 No input file specified 错误。
关键在于:phpMyAdmin 的入口是 index.php,所有请求必须显式映射到该文件,并剥离多余路径段供其内部路由使用。
- 必须用
fastcgi_split_path_info拆分 PATH_INFO,否则setup/这类路径无法识别 -
fastcgi_param SCRIPT_FILENAME必须指向真实磁盘路径,不能用$request_filename(它可能为空或错误) - phpMyAdmin 需要较大 POST 数据和上传体积,
client_max_body_size和 PHP 的post_max_size/upload_max_filesize要同步调大
location 块里怎么写 fastcgi_param 才不丢 PATH_INFO
常见错误是只写 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;,这会让 /phpmyadmin/export.php/table1 中的 /table1 丢失,导致导出功能失败。
正确做法是在 location ~ ^/phpmyadmin/(.*\.php)$ 内显式拆分:
location ~ ^/phpmyadmin/(.*\.php)$ {
alias /usr/share/phpmyadmin/;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
fastcgi_param SCRIPT_FILENAME $request_filename;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
include fastcgi_params;
}
注意三点:
-
alias路径末尾不能加/,否则$request_filename会拼出双斜杠 -
fastcgi_param SCRIPT_FILENAME $request_filename—— 这里必须用$request_filename,不是$document_root$fastcgi_script_name,因为alias已改变根路径 -
include fastcgi_params要放在最后,避免被前面的fastcgi_param覆盖
为什么用了 alias 还报 404?检查这三个地方
这是最常卡住的环节。即使 location 匹配成功,Nginx 仍可能找不到文件。
-
alias路径是否真实存在且 Nginx worker 进程有读权限?用ls -l /usr/share/phpmyadmin/index.php确认 - 是否遗漏了
index指令?在location /phpmyadmin/块中加index index.php;,否则访问/phpmyadmin/会返回 403 或 404 - 是否启用了
autoindex off;?默认关闭即可,但若意外开启会干扰 PHP 文件执行
一个最小可用配置片段:
location /phpmyadmin/ {
alias /usr/share/phpmyadmin/;
index index.php;
autoindex off;
location ~ ^/phpmyadmin/(.*\.php)$ {
alias /usr/share/phpmyadmin/;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
fastcgi_param SCRIPT_FILENAME $request_filename;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
include fastcgi_params;
}
}
上传大 SQL 文件失败?不只是 Nginx 的锅
client_max_body_size 512M 加了还是失败,大概率是 PHP-FPM 层面的限制没同步放开。
- Nginx 配置中加:
client_max_body_size 512M;(放在 http/server/location 均可,建议 server 级) - 对应 PHP 版本的
php.ini(如/etc/php/8.2/fpm/php.ini)改三处:post_max_size = 512Mupload_max_filesize = 512Mmax_execution_time = 600(导入大库需要更长时间) - 重启服务顺序不能错:先
systemctl restart php8.2-fpm,再nginx -t && systemctl reload nginx
如果上传后页面空白,用浏览器开发者工具看 Network → XHR,查响应头是否有 X-Powered-By: PHP —— 没有说明请求根本没进 PHP,问题还在 Nginx 转发链上。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











