ThinkPHP 6.0在Nginx下404主因是请求未进入框架:需用try_files而非if指令(phpEnv禁用if)、正确配置fastcgi_param PATH_INFO、root必须指向public目录、重启PHP-FPM生效,且PHP进程用户需有index.php读取权限。

ThinkPHP 6.0 在 Nginx 下不配伪静态,index.php 就没法隐藏,所有带路由的请求(比如 /user/list)都会直接 404 —— 不是代码写错了,是 Nginx 根本没把请求转给 PHP 处理。
为什么 if(!-e $request_filename) 在宝塔能用、在 phpEnv 却报 500?
因为 phpEnv 默认禁用 if 指令在 location 块里,强行加会触发 nginx: [emerg] "if" directive is not allowed here;而宝塔默认允许,且其 fastcgi_param 和 root 路径约定更宽松。
- phpEnv 必须改用
try_files $uri $uri/ /index.php?s=$uri&$args,&$args不能省,否则?page=2这类参数会丢失 -
s=$uri中的$uri是原始路径(不含 query string),不是/$1或$1,开头多斜杠会导致 TP6 的PATH_INFO解析失败 - 这条规则必须插在
location ~ \.php$之前,否则 PHP 文件匹配优先级更高,重写逻辑根本不会触发
fastcgi_param PATH_INFO 被注释或缺失导致 “URL pathinfo not supported”
即使 rewrite 规则完全正确,TP6 启动时仍可能抛出这个错误——它不是 Nginx 报的,而是 PHP 层检测到 $_SERVER['PATH_INFO'] 为空或格式异常后主动终止。
- 打开
D:/phpEnv/php/php-version/etc/php-fpm.d/www.conf,确认fastcgi_param PATH_INFO $fastcgi_path_info;这行未被注释 - 如果找不到,手动添加在
fastcgi_param SCRIPT_FILENAME后面;不要写成$document_uri或硬编码字符串 - 改完必须「重启 PHP-FPM」,仅重载配置不生效
- 顺手检查
php.ini中disable_functions是否含scandir:TP6 启动时用它扫描app/目录,禁用会导致白屏且无明确报错
根目录设错:访问 /index.php 能开,但 /app/config.php 也能下载
这是严重安全风险。TP6 强制入口在 public/,但 phpEnv 新建站点时默认 root 指向项目顶层(如 D:/phpEnv/www/myapp),而不是 .../myapp/public。
立即学习“PHP免费学习笔记(深入)”;
- 进 phpEnv 主界面 → 网站管理 → 找到站点 → 「修改」→ 把「网站根目录」改成完整路径,例如
D:/phpEnv/www/myapp/public - 改完必须点「重启 Nginx」+「重启 PHP-FPM」,只点「重载」不生效
- 验证方式:
http://localhost/index.php应正常打开,http://localhost/app/config.php必须返回 404;若返回文件内容,说明 root 还没切对
最易被忽略的是 PATH_INFO 的传递链:Nginx 的 try_files 写对了,fastcgi_param 也启用了,但 PHP-FPM 子进程用户(如 www)若没权限读取 public/ 下的 index.php,照样静默失败——此时页面空白,error log 里只有 Permission denied 一行,容易误判为配置问题。



















