php文件被下载而非执行,说明nginx未将请求转发给php处理,根本原因是fastcgi链断裂:location ~ .php$块缺失或fastcgi_pass端口不匹配、php-cgi.exe未监听或权限/路径错误导致script_filename失效。

PHP 文件在浏览器里直接下载,不是执行,说明 Nginx 根本没把请求交给 PHP 处理,而是当成静态文件吐给了浏览器 —— 这和 phpEnv 的 MIME 配置无关,本质是 FastCGI 转发链断裂。
为什么 phpEnv 下的 Nginx 会下载 PHP 文件而不是解析
phpEnv 是 Windows 下的集成环境(类似 XAMPP),它默认用 php-cgi.exe 模拟 PHP-FPM 行为。但它的 Nginx 配置常被精简或固化,location ~ \.php$ 块可能缺失、被注释,或 fastcgi_pass 指向错误端口(比如写了 9001 但实际 php-cgi.exe 监听的是 9000)。MIME 类型(如 AddType)在 Nginx 中完全无效 —— 它只存在于 Apache;Nginx 不靠扩展名映射类型,而是靠 location 匹配 + fastcgi_pass 转发。
- 常见错误现象:
http://localhost/index.php点击后弹出“保存”对话框,响应头中Content-Type: application/octet-stream或空 - 根本原因不是 MIME,而是 Nginx 没命中任何 PHP 处理规则,回退到默认的静态文件处理逻辑
- phpEnv 的控制面板有时会“自动重写”
nginx.conf,改完配置重启服务后又被覆盖
检查并修复 phpEnv 的 nginx.conf 中 PHP 处理块
打开 phpEnv 安装目录下的 nginx/conf/nginx.conf(注意:不是子目录里的 vhost 文件),定位到 server 块内,确认存在且启用以下配置:
location ~ \.php$ {
try_files $uri =404;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
-
fastcgi_pass必须与你启动的php-cgi.exe监听地址一致(常见是127.0.0.1:9000,可在 phpEnv 启动日志或任务管理器中确认进程参数) -
$document_root要和当前server块的root路径严格匹配,Windows 下注意反斜杠转义或统一用正斜杠(如C:/phpenv/www) - 删掉任何形如
add_header Content-Type text/html;或AddType的 Apache 风格指令 —— Nginx 会报语法错误 - 修改后必须运行
nginx -t测试配置,再nginx -s reload(或通过 phpEnv 面板重启 Nginx)
验证 php-cgi.exe 是否真正在监听并响应
phpEnv 的 PHP CGI 进程容易静默退出或端口冲突。不能只看面板上“PHP 已启动”,要实测通信:
- 命令行执行
netstat -ano | findstr :9000,确认 PID 对应的是php-cgi.exe - 临时用
curl -v http://127.0.0.1:9000会失败(正常),但telnet 127.0.0.1 9000应能连上(证明端口开放) - 检查 phpEnv 日志目录(通常是
logs/php-cgi.log)是否有bind failed或failed to listen报错 - 如果用的是 RunHiddenConsole 启动,确保批处理中路径无空格、无中文,且
-c参数指向的是真实php.ini(不是php.ini-development) -
cgi.force_redirect = 0和fastcgi.impersonate = 1这两项在php.ini中必须生效,否则 Windows 下 CGI 模式直接拒绝请求
最容易被忽略的 Windows 权限与路径陷阱
Windows 下 phpEnv 的失败,80% 出在路径和权限的隐式约束上:
-
root路径若含中文(如C:\我的项目)或空格(如C:\Program Files\...),$document_root$fastcgi_script_name拼接后会导致SCRIPT_FILENAME错误,PHP 返回 404 或直接下载 -
php-cgi.exe进程默认以当前用户身份运行,但它需要读取php.ini和项目目录下所有 PHP 文件 —— 如果项目放在C:\Users\XXX\OneDrive,可能因同步状态导致文件不可见 - 杀毒软件(尤其 360、腾讯电脑管家)会拦截
php-cgi.exe的网络监听行为,表现为端口不开放、无日志、Nginx 报connect() failed (10061: Connection refused) - phpEnv 控制面板的“网站根目录”设置,有时会覆盖
nginx.conf里的root,优先以面板设置为准,修改后需点“应用”而非仅保存配置文件
复杂点在于:所有环节(Nginx 配置、php-cgi 启动参数、php.ini 设置、Windows 权限、第三方拦截)都必须同时成立,缺一不可。任何一个地方多一个空格、少一个分号、路径少一个斜杠,都会退化成下载行为 —— 它不报错,只沉默地交出原始文件。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











