php artisan route:list 用于精准排查路由问题:403看middleware列(如auth、admin),404查uri/method是否匹配及是否注册,注意web/api分组、前缀、资源路由生成规则,用grep快速筛选,--verbose查看控制器路径。

php artisan route:list 输出的表格不是用来“扫一眼”的,而是要带着具体问题去查——比如访问 /admin/users 报 403,或者点开某个链接直接 404,这时候才该翻这个表。
看清楚 Middleware 列,它往往决定你能不能进得去
403 Forbidden 几乎总是中间件拦的。比如你看到某行的 Middlewares 列写着 web, auth, admin,而你没登录,或没 admin 权限,请求就会卡在 auth 或 admin 这一层。特别注意带条件的中间件,像 throttle:60,1 或自定义中间件名(如 CheckAdminLogin),它们不会报错,但会静默拒绝。
- 如果目标路由没列在表里,说明它根本没被注册——检查是不是写在
routes/api.php却用浏览器访问(默认走web中间件组) - 如果列出来了但
Middlewares是空的,不代表没中间件——可能它属于Route::middleware(['web'])->group(...)整体包裹,此时整组都继承了web -
web和api是两个独立中间件组,route:list默认只显示当前环境加载的路由文件,不混在一起
URI 和 Method 对不上,就一定是 404 或 MethodNotAllowed
表格里的 Method 和 URI 是严格匹配的。比如你写了 Route::post('/login', ...),但前端发的是 GET 请求,就不会命中这行,而是继续往下找,找不到就 404;或者找到另一行 GET /login,那就进错逻辑了。
- 留意 URI 是否带前缀:比如
Route::prefix('api')->group(...)下的/users实际注册为/api/users,表里显示的就是后者 - 资源路由(
Route::resource('posts', ...))会生成多行,每行对应一个动作(index、create、store等),别只盯着名字含posts的那行 - 带参数的 URI 如
/users/{id},表里显示的就是字面量{id},不是正则或通配符,匹配时由框架内部处理
用 grep 快速定位,别靠眼睛拉滚动条
项目路由一多,表格动辄上百行。php artisan route:list | grep "admin" 能立刻筛出所有含 admin 的 URI;更准一点可以加引号和锚点:php artisan route:list | grep "POST.*login" 找登录接口。
- Windows 用户请用
findstr替代grep:php artisan route:list | findstr "dashboard" - 想看完整结构(比如含控制器全路径),加
--verbose参数:php artisan route:list --verbose - 只关心某几个字段?暂时没法指定列,但可以配合
cut或导出后用 Excel 处理(先php artisan route:list > routes.txt)
真正容易被忽略的是:路由列表反映的是「当前配置下实际注册的结果」,不是你代码里写的原样。比如 Route::middleware(['web']) 包裹的组,在 route:list 里不会体现“这个 group 有 middleware”,只会把 middleware 写进每一行的 Middlewares 列——所以得横向比对,不能只看单行。











