根本原因是Nginx不读取.htaccess、不兼容Apache重写语法,且未正确转发请求至/public/index.php入口:需手动配置Nginx规则(置于location ~ .php$之前)、root指向public目录、透传PATH_INFO、禁用fastcgi_split_path_info干扰。

ThinkPHP项目迁移到Nginx后伪静态失效,根本原因是Nginx不读取.htaccess、不兼容Apache的重写语法,且默认未将请求正确转发至框架入口——绝大多数404或白屏问题都卡在这一步,和代码无关。
服务器不识别.htaccess文件
Apache靠.htaccess实现动态重写,Nginx完全无视该文件。即使你把原项目的.htaccess完整复制过去,Nginx也不会执行其中任何规则,所有非首页URL都会被当作静态路径查找,找不到就直接返回404。
必须把重写逻辑手动写进Nginx配置文件(如站点conf),不能依赖文件自动加载。
伪静态规则位置或写法错误
常见错误包括:
立即学习“PHP免费学习笔记(深入)”;
- 规则放在
location ~ \.php$块之后——PHP匹配优先级更高,if或try_files根本不会触发 - 重写目标写成
/index.php?s=,但TP6/8实际入口是/public/index.php,路径不存在导致404 - 用
break代替last,重写后不重新匹配location,无法进入PHP处理流程 - 子目录部署时没截断URI前缀,比如访问
/myapp/user/list,却重写到/index.php?s=/myapp/user/list,路由解析错乱
PATH_INFO未透传或被禁用
TP6/8默认依赖$_SERVER['PATH_INFO']解析路由,而Nginx默认不传递该变量。若PHP配置中禁用了putenv或ini_set,或fastcgi_param里漏掉:
fastcgi_split_path_info ^(.+\.php)(/.+)$;fastcgi_param PATH_INFO $fastcgi_path_info;
那么$_SERVER['PATH_INFO']始终为空,框架收不到真实路径,静默跳默认路由或返回404。
Web服务器根目录未指向public
TP6/8强制入口为public/index.php,但Nginx的root常被设在项目根目录(含app、config等)。结果:
- 静态资源如
/static/css/app.css查不到,返回404 - PHP自动加载失败,
vendor/autoload.php路径错误,页面空白 - 哪怕伪静态规则写对了,
/public/index.php也因root不对而无法定位
必须确认Nginx中root指令明确指向/path/to/project/public,宝塔用户则需在「运行目录」选/public并重载服务。



















