php文件被浏览器下载是因为nginx未将请求转发给php-fpm,主因是php-fpm未运行、nginx缺少/错误配置php处理块、或script_filename路径不匹配;需依次检查服务状态、location配置及root路径一致性。

PHP文件被浏览器下载而不是执行,说明Nginx没有把请求交给PHP-FPM处理,本质是PHP解析链路中断。核心问题通常出在三处:PHP-FPM没运行、Nginx配置里缺少或写错PHP处理块、SCRIPT_FILENAME路径不匹配。下面分步排查和修复。
确认PHP-FPM服务已启动并监听
PHP文件要执行,必须有PHP-FPM进程在后台运行并接受Nginx转发的请求:
- 检查PHP-FPM是否安装:运行
php-fpm -v或where php-fpm(Windows) /which php-fpm(Linux) - 启动服务(Linux):
sudo systemctl start php8.2-fpm;设开机自启:sudo systemctl enable php8.2-fpm - 验证监听状态:
sudo ss -tlnp | grep ':9000'(TCP方式)或ls -l /run/php/php8.2-fpm.sock(Unix socket方式) - Windows下若用CGI模式,需手动运行:
php-cgi.exe -b 127.0.0.1:9000,并确保该命令持续运行
检查Nginx配置中PHP location块是否完整有效
在站点配置文件(如 /etc/nginx/sites-enabled/default 或 D:\nginx\conf\nginx.conf)中,找到或添加以下标准PHP处理段:
- 确保启用
index.php:在location /块内,index指令应包含index.php,例如:index index.php index.html index.htm; - 必须存在且未注释的
location ~ \.php$块,推荐使用 Unix socket(更稳定):location ~ \.php$ {<br> include snippets/fastcgi-php.conf;<br> fastcgi_pass unix:/run/php/php8.2-fpm.sock;<br> fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;<br>} - 若无
snippets/fastcgi-php.conf,需手动补全关键参数,尤其不能遗漏fastcgi_param SCRIPT_FILENAME和fastcgi_pass - Windows用户注意:若用TCP方式,
fastcgi_pass应为127.0.0.1:9000,且PHP需以php-cgi -b 127.0.0.1:9000启动
核对root路径与文件实际位置是否一致
Nginx通过 $document_root$fastcgi_script_name 拼出PHP脚本绝对路径,一旦 root 设置错误,SCRIPT_FILENAME 就会指向不存在的文件,导致Nginx放弃转发而直接下载:
- 检查
server块中的root指令,例如:root /var/www/html;(Linux)或root D:/nginx/html;(Windows) - 确认你的
index.php确实放在该目录下,路径区分大小写(Linux)且不能含中文或空格(Windows) - 避免在
location ~ \.php$内重复写root,除非有特殊多目录需求;如有,务必与外层一致 - 可临时加一行日志辅助定位:
error_log /var/log/nginx/php-debug.log notice;,再访问PHP页面看报错
重载配置并验证结果
每改完一次配置都要生效,别跳过这步:
- 测试配置语法:
nginx -t(Linux/macOS)或nginx -t(Windows cmd中运行) - 重载配置:
sudo nginx -s reload(Linux)或nginx -s reload(Windows) - 创建一个最小测试页
index.php放在根目录:<?php phpinfo(); ?> - 浏览器访问
http://localhost/index.php,成功显示PHP信息页即修复完成
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











