访问 / 直接 404 是因为 thinkphp 6+ 默认不预设任何路由规则,根路径未绑定控制器,请求根本未进入控制器解析流程。

ThinkPHP 默认控制器和默认方法不靠“自动发现”,而是由路由层显式控制;没配对的 default_controller 和 default_action,或没写 Route::get('/', ...),根路径访问必然 404。
为什么访问 / 直接 404?
ThinkPHP 6+ 默认不预设任何路由规则,/ 路径没有绑定控制器,框架就找不到处理逻辑。这不是“没加载控制器”,而是“根本没走到控制器解析那步”。常见现象包括:
- 浏览器打开
http://localhost/显示 404,但http://localhost/index/index正常 -
php think route:list输出里看不到/对应的路由项 - 清过缓存(
php think route:clear)仍无效
本质是路由未注册,不是控制器文件放错位置或命名错误。
配置默认控制器的两种可靠方式
推荐优先用路由绑定,其次才考虑全局 default 配置——前者明确、可调试、不干扰其他路由;后者是兜底逻辑,容易被 url_route_must 或模块隔离覆盖。
- 在
config/route.php中添加:Route::get('/', 'Index/index');,然后执行php think route:clear - 若需统一所有未匹配路径都走某个控制器,再加全局配置:
'default_module' => 'index', 'default_controller' => 'Index', 'default_action' => 'index',但必须确保'url_route_must' => false - 多应用模式下,
default_module值要对应实际应用目录名,比如admin,不能写成Admin或application/admin
控制器和方法名必须严格匹配
即使路由配对成功,Index/index 仍可能报错,原因几乎都出在类/文件/命名空间不一致:
- 控制器文件必须放在
app/controller/下,不能是app/Controller或app/controllers - 文件名必须是
Index.php(首字母大写,无后缀),类名必须是Index,命名空间必须是app\controller - 方法必须是
public function index(),不能叫__invoke(),也不能漏掉public修饰符 - 如果改过应用命名空间(如把
app改成src),需同步更新config/app.php中的app_namespace配置项
别踩入口文件手动塞 $_GET['s'] 的坑
有些文档建议在 public/index.php 里加 if (empty($_GET['s'])) { $_GET['s'] = '/index/index'; },这看似简单,但极易引发冲突:
- PATH_INFO 已被 Apache/Nginx 正确解析时,
$_GET['s']可能为空但实际已有路由信息,强行赋值会覆盖真实路径 - 与中间件、多语言路由、子域名部署等扩展逻辑不兼容
- 调试困难:请求明明进了框架,却在某处被悄悄重写,日志里找不到线索
真正需要干预入口逻辑的场景极少,99% 的问题用前三种方式就能解决。硬改入口文件,等于绕过框架设计约束,后续升级或加插件时大概率翻车。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











