thinkphp6.0出现404主因是nginx/apache未正确解析pathinfo,导致请求未进入框架;需配置try_files或fastcgi_param path_info,并排除error_page拦截、路由缓存及低版本bug。

ThinkPHP6.0 出现 404,90% 的情况不是你路由写错了,而是请求压根没进到框架里——Nginx 或 Apache 直接返回了原生 404,public/index.php 根本没被执行。
为什么访问 /index.php/xxx 就 404,但加 ?s=/xxx 就正常?
这是典型的 PathInfo 解析失败。TP6 默认用 /index.php/控制器/方法 这种格式,但 Nginx 默认不识别这种路径,会当成真实文件去查,查不到就甩个 404 给你。
- 确认你的 Nginx 配置中
location /块里有这行:try_files $uri $uri/ /index.php?$query_string; - 如果用了
fastcgi_split_path_info,必须配对使用fastcgi_param PATH_INFO $fastcgi_path_info;,否则$_SERVER['PATH_INFO']为空,TP6 拿不到路由段 - Apache 用户检查
public/.htaccess是否被读取:确认AllowOverride All已在虚拟主机配置中开启,且mod_rewrite已启用 - Windows IIS 用户必须装 URL Rewrite 模块,并把
public/web.config导入站点
能进框架但路由不匹配,php think route:list 看不到你的路由?
说明路由文件根本没加载,或者被环境或配置拦下了。
- 检查
config/app.php中'url_route_on' => true和'url_route_must' => true是否都为true - APP_DEBUG = false 时,路由会被缓存到
runtime/route/;改了app/route/app.php不生效,直接删掉整个runtime/route/目录 - 多应用模式下,路由文件应在
app/应用名/route/app.php,而不是app/route/app.php;同时确认config/app.php的app_map里已声明该应用 - 检查是否漏写了
use think\facade\Route;—— 没这句,Route::get()会报Class 'Route' not found
明明路由注册了,访问却跳到 Nginx 自带的 404 页面?
这是 Web 服务器抢在 PHP 前截胡了 404 响应,TP6 的 Route::miss() 根本没机会执行。
- 检查 Nginx 配置里有没有
error_page 404 /404.html;这类语句,注释掉它 -
Route::miss()必须放在app/route/app.php所有Route::get()、Route::post()之后,否则会被前面的通配规则(比如Route::any('[:all]', ...))提前吞掉 -
Route::miss()返回的响应默认是 HTTP 200,要显式设状态码:return response()->view('404', [], 404); - 别在 404 模板里调用
url()辅助函数——路由未匹配时它会出错;用绝对路径或硬编码链接
最常被忽略的一点:TP6.0.x 早期版本(如 6.0.0~6.0.7)存在路由解析 Bug,升级到 v6.1.5+ 能解决一批莫名其妙的 404;运行 composer update topthink/framework 再试。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











