根本原因是laravel伪静态规则与tp6入口路径(/public/index.php)、path_info解析机制及php运行环境不兼容,直接套用导致nginx 404或路由失效。

ThinkPHP 6.0.14 用 Laravel 的伪静态规则会 404,根本原因不是“规则写得像不像”,而是两者路由机制和入口结构完全不同——直接照搬等于让 Nginx 去敲一扇根本不存在的门。
入口路径不匹配:/public/index.php vs /index.php
ThinkPHP 6 强制入口在 public/index.php,而 Laravel 的标准规则(如 try_files $uri $uri/ /index.php?$query_string;)默认指向根目录下的 /index.php。Nginx 找不到这个文件,直接返回 404,压根没进 PHP。
- TP6 项目结构:/www/wwwroot/myapp/public/index.php 是唯一合法入口
- Laravel 规则假设:/www/wwwroot/myapp/index.php 存在(实际不存在)
- 结果:Nginx 层 404,日志里会出现
"index.php" is not found
PATH_INFO 解析方式冲突:s= 参数 vs QUERY_STRING
TP6 默认启用 pathinfo 模式,依赖 $_SERVER['PATH_INFO'] 或 $_GET['s'] 解析路由(如 /user/list → s=/user/list)。Laravel 的 ?$query_string 把全部路径塞进 QUERY_STRING,但 TP6 不认这种格式,$_GET['s'] 为空,路由系统失效。
- Laravel 规则传递的是完整原始 URI,靠框架自己解析
- TP6 需要显式重写为
/public/index.php?s=/user/list格式 - 若只用
try_files ... /index.php?$query_string,TP6 启动时检测不到有效 pathinfo,报错 “URL pathinfo not supported”
运行目录与规则位置双重错位
即使你手动把 Laravel 规则改成 /public/index.php,只要没同步改对两个硬性条件,照样 404:
-
运行目录未设为
/public:宝塔默认指向项目根目录,Nginx 在错误路径下找文件 -
规则没放在
location ~ \.php$之前:Nginx 先匹配 .php 文件,if 块完全不执行 -
用了
break或redirect而非last:重写后不重新走 location 匹配,请求无法落到 PHP 处理块
PHP 层支持缺失:禁用函数拦住 TP6 启动
TP6 启动时需调用 scandir 扫描应用目录、putenv 和 ini_set 设置运行环境。Laravel 环境常禁用这些函数,但 TP6 一旦被拦,连基础 PATH_INFO 初始化都失败,直接拒绝处理请求。
- 检查宝塔 PHP 设置 → 禁用函数列表,确保
scandir、putenv、ini_set未被勾选 - 确认 fastcgi_param PATH_INFO 行未被注释:
fastcgi_param PATH_INFO $fastcgi_path_info;
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











