route::get('/', 'index') 报404是因为thinkphp 7废弃隐式控制器推导,'index'非完整类名或命名空间路径,框架无法解析;必须用全限定类名数组形式如[index::class, 'index'],并确保路由定义在app/route/app.php中。

为什么 Route::get('/', 'index') 会报 404
因为 ThinkPHP 7 默认关闭隐式控制器推导,'index' 这种写法已不被识别——它既不是完整类名,也不是命名空间路径,框架直接跳过解析,返回「路由未匹配」。
常见错误现象:访问 / 时页面空白或 404,但 /index/index 能正常打开;php think route:list 输出里完全找不到 / 这条路由。
-
'index'是 TP5 的简写语法,TP7+ 已废弃,必须显式写出控制器类的完整引用 - 即使你写了
Route::get('/', 'index'),框架也不会自动补成app\controller\Index::index - 若同时启用了注解路由(
route_annotation => true),但没在Index类上加@Controller,也一样不生效
Route::get('/', 'Index') 仍失败的三个硬性条件
TP7 要求控制器类名、文件名、命名空间、路径四者严格对齐,缺一不可。哪怕只错一个,'Index' 就无法定位到类。
- 文件必须是
app/controller/Index.php(注意大小写,Linux 下index.php≠Index.php) - 类名必须是
class Index,不能是class IndexController或class index - 命名空间必须是
namespace app\controller;(末尾无多余斜杠,且大小写一致) - 该类必须继承
think\Controller或think\controller(TP7 推荐后者)
为什么加了 index.php 能访问,去掉就 404
这不是路由问题,是 Web 服务器根本没把请求转发给 ThinkPHP。加 /index.php/ 能通,说明框架本身没问题;去掉后 404,代表伪静态规则失效或未配置。
- Nginx 用户检查
location /块是否含try_files $uri $uri/ /index.php?$query_string;($query_string不可省) - Apache 用户确认
public/.htaccess存在且内容标准,同时<directory></directory>配置中设置了AllowOverride All - 多应用模式下,如果首页属于
app/home,但伪静态指向的是根public/index.php,也会因入口文件路径错位导致路由不加载
最稳的首页路由写法(推荐直接抄)
别依赖任何约定,用全限定类名 + 方法数组形式,绕过所有推导歧义:
use think\facade\Route;
use app\controller\Index;
Route::get('/', [Index::class, 'index']);
这个写法不查模块名、不拼路径、不猜方法,默认不走隐式规则,只要类存在、方法 public、命名空间正确,就能跑通。
容易被忽略的一点:TP7 的路由注册文件必须放在 app/route/app.php(单应用)或对应子应用的 app/{name}/route/app.php,写在 config/route.php 里等于没写。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











