ThinkPHP在Nginx下404主因是rewrite规则未配对或PATH_INFO传递异常;推荐用try_files $uri $uri/ /index.php?$query_string;替代if判断,因其绕过PATH_INFO依赖、性能更高且兼容TP5/6的s参数路由模式。

ThinkPHP 在 Nginx 下 404,不是框架有问题,是 rewrite 规则没配对,或者 PATH_INFO 传递被干扰——这两点踩中任意一个,index.php 就藏不住。
location / { try_files $uri $uri/ /index.php?$query_string; } 为什么比 if(!-e ...) 更稳
这个写法直接绕过 PATH_INFO 解析逻辑,用 QUERY_STRING 传参,TP5/6 默认路由模式(url_common_param 为 s)能原生识别 /index.php?s=home/index 这种形式,不依赖 $_SERVER['PATH_INFO'] 的正确性。
-
try_files是 Nginx 原生命令,性能比if块高,且不会因嵌套或变量作用域出错 - 必须确保
root指向public/目录,否则$uri匹配不到静态资源,连 CSS/JS 都 404 - 如果项目部署在子目录(如
/tp6/),不能只改location /,得用location /tp6/+alias,且alias路径末尾必须带斜杠,index.php路径要手动拼对 - 删掉所有
fastcgi_split_path_info相关行——TP 不需要它,留着反而会让$_SERVER['PATH_INFO']变成空或错乱值
为什么加了 rewrite 还报 “URL pathinfo not supported”
这是 TP6 启动时检测到 $_SERVER['PATH_INFO'] 为空或格式非法触发的硬性拦截,常见于 PHP-FPM 配置未透传路径信息。
- 检查 PHP-FPM 的
www.conf或站点 fastcgi_params:必须有fastcgi_param PATH_INFO $fastcgi_path_info;,不能注释或删掉 - 宝塔用户注意:升级 PHP 版本后这行常被重置,需手动补回
-
php.ini中cgi.fix_pathinfo=1必须开启(默认是 1,但某些 Docker 镜像或安全加固会设为 0) - 临时调试可直接在
public/index.php开头加$_SERVER['PATH_INFO'] = $_SERVER['REQUEST_URI'];,上线前务必删掉
runtime 权限设成 775 却还报 mkdir(): Permission denied
错误不在权限数字本身,而在 Nginx 工作进程用户和 runtime 所属组不一致。
立即学习“PHP免费学习笔记(深入)”;
- 先运行
ps aux | grep nginx | head -1看主进程用户(Ubuntu 通常是www-data,CentOS 是nginx) - 执行
chgrp www-data runtime && chmod 775 runtime && chmod g+s runtime,g+s确保新生成的子目录自动继承组 - 别用
chmod 777:TP6 的runtime/session/存的是 session 文件,开放写权限等于允许未授权覆盖 - 检查父级目录权限:
config/、application/等目录不能被 Nginx 用户 traverse 到,否则可能被直接 HTTP 访问
最易被忽略的是:改完 Nginx 配置后,必须执行 nginx -t && nginx -s reload,宝塔用户要点「重载 Nginx」而不是只点保存;debug 不生效往往是因为 .env 里 APP_DEBUG=true 没写对,或者清缓存时漏了 php think clear:config。这些点不卡住,伪静态就只是几行配置的事。



















