入口文件根本没被执行,所有伪静态404的根源是public/index.php未被调用;需确认Apache的.htaccess与AllowOverride、Nginx的try_files及运行目录设为/public,并强制配置fastcgi_param PATH_INFO透传。

入口文件根本没被执行,怎么配都白搭
所有伪静态 404 的起点,都是 public/index.php 压根没被 Nginx 或 Apache 调用。比如访问 /user/list 返回原生 404(没 TP 黄色报错页),但 /index.php/user/list 能正常打开——这就是典型信号。
- Apache 用户:确认
.htaccess在项目根目录(和index.php同级),权限为644,且虚拟主机配置中AllowOverride All已启用 - Nginx 用户:必须在
location /块里写try_files $uri $uri/ /index.php?$query_string;,不能只靠宝塔下拉选“ThinkPHP”——那个默认规则适配 TP5,对 TP6 的public/结构大概率失效 - 宝塔用户特别注意:网站目录 → 运行目录必须设为
/public;设错会导致/index.php实际指向服务器上不存在的路径
PATH_INFO 为空,路由系统收不到路径信息
TP6 默认走 pathinfo 模式(如 /index.php/user/list),但 Nginx 不像 Apache 自动提取 PATH_INFO。即使重写成功,$_SERVER['PATH_INFO'] 为空,路由就卡死。
- 必须在
location ~ \.php$块内加两行: fastcgi_split_path_info ^(.+\.php)(/.+)$;fastcgi_param PATH_INFO $fastcgi_path_info;- 漏掉任意一行,
/user/list就永远匹配不到控制器 - PHP 8.4+ 默认不解析
PATH_INFO,这行配置不是可选,是刚需
路由文件没加载或缓存没清,改了等于没改
php think route:list 不显示你写的路由?说明框架压根没读到它。这不是 404 的表象,而是深层原因。
- 路由必须定义在
app/route/app.php(单应用)或app/index/route/app.php(多应用),不能写在控制器、中间件或钩子里 - 检查
config/app.php中'url_route_on' => true是否生效,且没被.env里的APP_ENV=testing等覆盖 -
APP_DEBUG = false时,TP6 会缓存路由到runtime/route/;改完路由后务必手动删掉该目录下所有文件 - 用了
Route::import()?确保传入路径是相对app/route/的,且目标文件存在、语法无 fatal error(比如漏分号)



















