核心问题是Nginx未将.php请求转发给PHP-CGI处理;需确认php-cgi.exe -b 127.0.0.1:9000已运行、location ~ .php$块含fastcgi_pass、SCRIPT_FILENAME等关键参数,root路径用正斜杠绝对路径,且php.ini中cgi.fix_pathinfo=1。

PHP 文件在 Windows 下被 Nginx 下载而非解析,核心问题只有一个:Nginx 没把 .php 请求转给 PHP 处理。这不是 PHP 没装好,而是转发链断了——从 Nginx 配置、PHP 启动方式,到路径和参数匹配,每环都得对上。
确认 PHP-CGI 正在监听 9000 端口
Windows 下 PHP 通常以 CGI 模式运行(非 PHP-FPM),需手动启动并绑定端口:
- 打开命令行,进入 PHP 安装目录(如
C:\php),执行:php-cgi.exe -b 127.0.0.1:9000 - 不要关闭该窗口,它就是 PHP 的“服务进程”;可配合脚本后台运行,但首次调试务必保持窗口可见
- 验证是否生效:运行
netstat -ano | findstr :9000,应看到LISTENING状态及对应 PID
检查 Nginx 配置中 location ~ \.php$ 块是否完整
在 nginx.conf 的 server 块内,必须有且仅有一段匹配 PHP 的配置,常见错误是漏参数或路径硬编码:
- 确保包含以下关键指令(顺序不重要,但缺一不可):
fastcgi_pass 127.0.0.1:9000;fastcgi_index index.php;fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;include fastcgi_params; -
$document_root必须与location /中的root值一致(例如root C:/nginx/html;),不能写成C:\nginx\html(反斜杠在 Nginx 中会出错) - 避免使用
root html;这类相对路径,Windows 下建议写绝对路径并统一用正斜杠
验证 php.ini 关键项已启用
PHP-CGI 对配置更敏感,尤其以下两项直接影响能否接收并执行请求:
立即学习“PHP免费学习笔记(深入)”;
- 打开
php.ini,确认:cgi.fix_pathinfo=1(必须为 1,否则 SCRIPT_FILENAME 解析失败) - 检查扩展是否启用,例如:
extension_dir = "ext"(路径要存在)extension=php_openssl.dll(至少保证基础扩展不报错) - 时区设置建议补上:
date.timezone = "Asia/Shanghai",避免日志中大量警告干扰判断
测试与排查顺序不能乱
每改一处,必须按顺序验证,跳步容易掩盖真实问题:
- 先访问一个纯 HTML 文件(如
test.html),确认 Nginx 本身工作正常 - 再放一个
index.php(内容仅<?php echo 'ok'; ?>),刷新页面看是下载、报错还是输出文本 - 查看
logs/error.log,重点搜connect refused(PHP 未监听)、no input file(SCRIPT_FILENAME 路径错)、Primary script unknown(文件不存在或权限问题) - 临时在
location ~ \.php$中加一行:error_log logs/php-debug.log notice;,单独捕获 PHP 相关日志



















