Nginx直接下载index.php而非执行,根本原因是未将请求转发给PHP-FPM处理,而是当作静态文件返回;常见于缺失location ~ .php$块、fastcgi_pass配置错误、SCRIPT_FILENAME路径拼接失败、fastcgi_params未引入或权限不匹配。
为什么Nginx会直接下载 index.php 而不是执行它?
根本原因是 nginx 没把 php 文件交给 php-fpm 处理,而是当作静态文件直接返回了原始内容。典型表现是访问 /phpmyadmin/ 时浏览器弹出下载对话框,保存下来的 index.php 文件里全是未解析的 php 代码。
- 最常见:Nginx 配置里漏了
location ~ \.php$块,或该块没包含fastcgi_pass指令 - 容易忽略:PHP-FPM 服务没运行,或
fastcgi_pass指向的 socket 地址(如unix:/run/php/php8.1-fpm.sock)和实际监听地址不一致 - 权限问题:Nginx worker 进程用户(通常是
www-data)对 PHP-FPM socket 文件没有读写权限
location ~ \.php$ 块必须包含哪些关键指令?
这个正则 location 是 PHP 执行的入口开关,缺一不可。只写 fastcgi_pass 不够,还必须显式传递脚本路径和文档根目录。
-
fastcgi_pass必须指向正在运行的 PHP-FPM 实例,例如unix:/var/run/php/php8.1-fpm.sock或127.0.0.1:9000 -
fastcgi_param SCRIPT_FILENAME要用$document_root$fastcgi_script_name,不能只写$fastcgi_script_name,否则 PHP-FPM 找不到真实文件路径 - 必须包含
include fastcgi_params;(或逐个定义必要参数),否则QUERY_STRING、REQUEST_METHOD等关键变量为空,phpMyAdmin 会报错 - 如果 phpMyAdmin 安装在子目录(如
/usr/share/phpmyadmin),root指令必须匹配,且fastcgi_param SCRIPT_NAME通常不需要手动覆盖
phpMyAdmin 的 location 配置要避开哪些坑?
phpMyAdmin 自带的 config.inc.php 对 URL 路径敏感,Nginx 的 rewrite 或 root 设置稍有偏差就会导致 CSS 加载失败、登录跳转异常或空白页。
- 不要用
alias指向 phpMyAdmin 目录——这会导致SCRIPT_FILENAME计算错误,PHP 找不到入口文件 - 推荐用
root /usr/share;+location /phpmyadmin/,这样$document_root是/usr/share,$fastcgi_script_name自动拼出/phpmyadmin/index.php - 确保
location ~ \.php$在location /phpmyadmin/内部或同级且顺序靠后,避免被更宽泛的 location 拦截 - 如果启用了
fastcgi_split_path_info,注意 phpMyAdmin 的 URL 结构(如/phpmyadmin/index.php/export)可能触发 PATH_INFO 解析错误,建议关闭:fastcgi_split_path_info off;
验证 PHP-FPM 是否真正响应请求?
别只看 systemctl status php8.1-fpm 显示 active,得确认它真在处理连接。
- 检查 socket 文件是否存在且权限正确:
ls -l /var/run/php/php8.1-fpm.sock,属主应为www-data或与 Nginx 用户一致 - 用
sudo -u www-data cgi-fcgi -bind -connect unix:///var/run/php/php8.1-fpm.sock测试 socket 连通性(需安装fcgiwrap或类似工具) - 临时在
location ~ \.php$里加add_header X-PHP-Status $upstream_status;,用 curl 查看响应头是否含502(连不上 PHP-FPM)或200 - 查看 PHP-FPM 错误日志:
tail -f /var/log/php8.1-fpm.log,常见错误如unable to connect to FastCGI server或Primary script unknown
路径拼接和权限链上的任何一个环节断掉,都会让 PHP 文件变成下载项。调试时盯住 Nginx error log 和 PHP-FPM log 里的第一行报错,比反复改配置更省时间。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











