PHP文件被下载说明Nginx未交由PHP解析器处理,需优先修复PHP解析基础配置:确保server块中存在正确location ~ .php$块,fastcgi_pass地址匹配PHP-FPM监听地址,cgi.fix_pathinfo=0,root精确指向public目录,并验证语法后重载。

PHP文件被下载,说明Nginx根本没把请求交给PHP解析器处理,而是当成普通文件直接返回了二进制流——这不是伪静态配错了,是PHP解析环节彻底失效。必须优先解决这个底层问题,否则后面所有rewrite或try_files规则都无从谈起。
确认并修复PHP解析基础配置
在server块里必须存在且正确配置处理.php文件的location块:
- 确保有类似这样的块,且未被注释或误删:
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000; # 或 unix:/var/run/php/php8.0-fpm.sock
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
} - $document_root必须指向项目public/目录(如/var/www/myapp/public),不是项目根目录;否则SCRIPT_FILENAME拼出来的是错路径,Nginx日志会报Primary script unknown
- 检查fastcgi_pass地址是否与你实际运行的PHP-FPM监听地址一致(用ps aux | grep php-fpm或ss -tlnp | grep :9000确认)
检查cgi.fix_pathinfo设置
PHP层面一个关键开关:php.ini中必须设为
- cgi.fix_pathinfo = 0(不是1,也不是注释状态)
- 改完后务必重启php-fpm服务(systemctl restart php8.0-fpm或对应版本)
- 不关这个,Nginx传过来的PATH_INFO可能为空,ThinkPHP路由就静默失败,页面空白或404
验证root路径是否精准指向public
这是ThinkPHP 5/6/8共通铁律:
立即学习“PHP免费学习笔记(深入)”;
- server块中的root指令必须写成:
root /var/www/myapp/public;(Linux)或
root D:/www/myapp/public;(Windows) - 如果写成root /var/www/myapp;,框架连autoload.php都加载不了,直接Fatal error且白屏
- 执行nginx -t确认语法无误,再nginx -s reload
排除干扰性错误写法
以下写法看似像在处理PHP,实则无效甚至有害:
- 在location ~ \.php$里漏掉fastcgi_param SCRIPT_FILENAME行——最常见错误
- 用$request_filename代替$document_root$fastcgi_script_name——路径拼接不可靠,尤其Windows下易因大小写或反斜杠出错
- 把PHP处理块写在location / { }内部,导致嵌套作用域混乱
- 配置文件编码含BOM或中文全角空格——复制粘贴时极易引入,建议用vim或notepad++转为UTF-8无BOM再保存



















