ThinkPHP6路由404的主因是请求未进入框架,而非路由定义错误;需优先检查Web服务器重写配置、public目录是否为根目录、.htaccess权限等,再排查路由语法、缓存、多应用路径及SCRIPT_FILENAME配置。

ThinkPHP6 路由没生效,直接 404 的常见原因
不是路由写错了,而是请求根本没进到 ThinkPHP 的路由解析环节。最典型的表现是:访问 /index/index 或 /api/test 都返回 Nginx/Apache 的原生 404,而不是 TP6 的「找不到路由」提示页(那个带调试信息的黄色页面)。
这意味着 Web 服务器压根没把请求转发给 public/index.php 入口文件。检查点优先级如下:
- 确认 Web 服务器配置是否启用重写(rewrite),比如 Nginx 的
try_files $uri $uri/ /index.php?$query_string;是否写在location /块里 - 确认
public/是网站根目录,不是项目根目录(即不能把thinkphp6/整个目录设为 root) - 确认
public/.htaccess在 Apache 下是否被允许(AllowOverride All是否开启) - Windows IIS 用户需确认是否安装 URL Rewrite 模块,并导入了
public/web.config
路由定义语法写错导致 404(但已进框架)
如果能看到 TP6 的错误页或调试栏,说明请求进了框架,问题出在路由注册阶段。ThinkPHP6 的路由定义默认在 app/route/app.php,且必须显式调用 Route::get()、Route::post() 等,不再自动读取控制器方法名。
常见低级错误:
立即学习“PHP免费学习笔记(深入)”;
- 忘记加
use think\facade\Route;,导致Route::get报Class 'Route' not found - 用字符串路径时漏掉前导斜杠,比如写成
Route::get('user/list', ...)(应为'/user/list') - 闭包路由没返回内容,如
Route::get('/test', function() { echo 'ok'; });—— 这会导致空响应,部分浏览器渲染为 404 感觉 - 使用资源路由
Route::resource('user', 'UserController');后,却用/user/create访问——这是 GET 请求,但资源路由中create对应的是GET /user/create,没问题;真正容易错的是 POST 提交到/user却没配store方法
环境与配置导致路由不加载
TP6 默认在 app/route/ 下按目录加载路由文件,但这个行为受 config/route.php 中的 default_route 和 route_config_file 控制,更关键的是环境开关。
-
APP_DEBUG = false时,路由会被缓存到runtime/route/,改了app.php不生效 —— 清除该目录下所有文件即可 - 使用了多应用模式(
app/multi),但路由文件放在了错误位置,比如应该在app/index/route/app.php,却写在了app/route/app.php - 启用了「强制 HTTPS」或「子目录部署」但没同步调整
config/app.php中的base_url或domain_bind,导致生成的 URL 和实际访问路径不一致,前端跳转后 404 - 自定义了
Route::rule()并设置了['https' => true],但当前是 HTTP 请求,匹配失败静默忽略
调试路由匹配过程的实操方法
别靠猜。TP6 提供了两个快速验证手段:
- 命令行执行
php think route:list,它会输出所有已注册路由(含中间件、变量规则)。如果列表为空,说明路由文件根本没加载;如果列表有但你的路径不在其中,就是定义位置或语法问题 - 临时在
public/index.php入口顶部加一行:var_dump($_SERVER['REQUEST_URI']); die;,确认浏览器发来的原始路径是否和你写的路由规则一致(注意 URL 解码、大小写、结尾斜杠) - 在路由闭包里加日志:
Route::get('/test', function () { \think\facade\Log::write('route hit'); return 'ok'; });,再查runtime/log/看有没有记录 —— 没记录=没匹配,有记录=匹配了但后续出错
最容易被忽略的是:Nginx 的 fastcgi_param SCRIPT_FILENAME 配置错误,会导致 PHP 看不到正确的 PATH_INFO,从而让 TP6 的路由解析器无法提取路径段。这个问题在非标准部署(如 Docker、宝塔子目录、反向代理)中高频出现。











