根本原因是nginx未将请求交由php-fpm处理或未按单入口机制转发uri;需配置fastcgi_pass、include fastcgi_params、try_files兜底至/index.php,并显式设置fastcgi_split_path_info与path_info。

PHP在Nginx下不解析、路由404、PATH_INFO为空——根本不是PHP写得不对,而是Nginx没把请求正确交给PHP-FPM,或没按框架的单入口机制转发URI。
location ~ \.php$ 块里缺了什么就直接下载PHP文件
这是最常卡住人的点:浏览器访问 index.php 时弹出下载框,说明Nginx压根没把请求转给PHP-FPM,而是当静态文件返回了二进制流。
-
fastcgi_pass地址错误:比如PHP-FPM实际监听127.0.0.1:9001,但配置里写了9000;Windows下基本只能用TCP,别写Unix socket路径 - 漏掉
include fastcgi_params;:这行一丢,SCRIPT_FILENAME就是空的,PHP-FPM收不到真实路径,直接拒收 -
location ~ \.php$被注释、拼错(比如写成location ~ \.php缺少结尾$),或被更宽泛的location /规则提前截断 - 改完没真正重启:phpEnv用户尤其注意——控制面板点“重启Nginx”可能只重启了Nginx,PHP-FPM还在跑旧配置;必须确认两者都重载
ThinkPHP/Laravel路由404,是因为没配 try_files
这些框架依赖所有请求(包括 /user/list 这种无后缀URL)都落到 index.php,由PHP内部解析路由。Nginx默认只认 .php 后缀,其他路径直接返回404。
- 必须在
location /块里加:try_files $uri $uri/ /index.php?$query_string; - 不能用
if (!-e $request_filename):phpEnv和新版Nginx默认禁用if在location中的重写,会报[emerg] "if" directive is not allowed here - root 必须指向
public/目录,不是项目根目录:否则.env可能被直接暴露,且静态资源路径错乱
$_SERVER['PATH_INFO'] 为空?要手动注入 fastcgi_param PATH_INFO
ThinkPHP、CodeIgniter等老框架靠 PATH_INFO 解析 /index.php/module/controller/action 这类URL;Nginx默认不生成这个变量,得显式传。
- 在
location ~ \.php$块里加一行:fastcgi_param PATH_INFO $fastcgi_path_info; - 确保前面有
fastcgi_split_path_info ^(.+?\.php)(/.*)$;(Laravel 5.5+ 不需要,但ThinkPHP 5/6必须) - 如果用了
alias指向子目录(比如二级目录部署),$document_root会失效,得改用$realpath_root配合SCRIPT_FILENAME
phpEnv用户别信控制面板,直接改 vhost/*.conf
phpEnv是Windows本地玩具环境,它的图形界面配置是假的,底层仍走真实Nginx配置文件。你调不通,八成是被它抽象层骗了。
- 真实配置在
C:\phpEnv\nginx\vhost\default.conf或类似路径,不是面板里填的“站点设置” - 改之前先关掉phpEnv控制面板,否则它可能在你保存后自动覆盖回旧内容
- 验证是否生效:访问
http://localhost/index.php看是否执行;再访问http://localhost/about(无后缀)看是否进index.php;最后var_dump($_SERVER['PATH_INFO'])确认值非空
PATH_INFO 和 try_files 是两套逻辑,不能混用却漏配其一;phpEnv 的抽象层会让这两个问题叠加爆发,调试时得一层层剥开看——先确认PHP文件能执行,再确认无后缀URL能进入口,最后确认PATH_INFO有值。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











