You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel中$middlewareGroups如何排除非认证路由?

优雅解决Laravel中间件组排除非认证路由的问题

嘿,这个需求我太懂了——谁也不想写一堆冗余的switch分支来判断路由!虽然Laravel的$middlewareGroups本身没有直接的“排除路由”配置项,但有两个非常优雅的方案能满足你的需求,而且完全基于中间件组来实现:

方案一:利用Laravel 8.57+的exclude方法(推荐)

从Laravel 8.57版本开始,路由分组新增了exclude方法,可以直接指定要排除的路由路径,完美适配你的场景。你只需要在RouteServiceProvider的boot方法里调整路由的中间件组应用逻辑:

public function boot()
{
    $this->routes(function () {
        // 将你的中间件组应用到所有web路由,除了指定的非认证路由
        Route::middleware('your-middleware-group-name')
             ->exclude(['/', '/login', '/register'])
             ->group(base_path('routes/web.php'));
    });
}

这个方法的好处是代码极简,不需要额外写中间件,直接通过框架原生方法实现排除逻辑,后期维护也方便——要加排除路由只需要在数组里加路径就行。

方案二:自定义前置中间件实现排除(兼容低版本Laravel)

如果你的Laravel版本低于8.57,也不用慌,我们可以给中间件组加一个前置中间件,用数组维护排除路由列表,代替繁琐的switch分支:

步骤1:创建自定义排除中间件

生成一个名为SkipGuestRoutes的中间件:

php artisan make:middleware SkipGuestRoutes

然后在中间件里编写排除逻辑:

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;

class SkipGuestRoutes
{
    // 维护需要排除的路由路径或路由名称
    protected $excluded = [
        // 按路径排除
        '/',
        '/login',
        '/register',
        // 也可以按路由名称排除(更灵活,路径变了也不影响)
        // 'login',
        // 'register',
        // 'home'
    ];

    public function handle(Request $request, Closure $next)
    {
        // 判断当前请求是否在排除列表里
        // 用路径判断
        if (in_array($request->path(), $this->excluded)) {
            return $next($request);
        }

        // 如果用路由名称判断,就换成下面这行
        // if (in_array($request->route()?->getName(), $this->excluded)) {
        //     return $next($request);
        // }

        // 不在排除列表,继续执行中间件组的后续逻辑
        return $next($request);
    }
}

步骤2:把中间件加入你的中间件组

打开app/Http/Kernel.php,将这个自定义中间件放到你的目标中间件组的最前面(确保它先执行,提前放行非认证路由):

protected $middlewareGroups = [
    'your-middleware-group-name' => [
        \App\Http\Middleware\SkipGuestRoutes::class,
        // 中间件组里的其他中间件,比如认证中间件等
        \Illuminate\Auth\Middleware\Authenticate::class,
        // ...其他中间件
    ],
];

这样一来,所有匹配排除列表的请求都会直接跳过后续的认证相关中间件,完全不用写一堆switch分支。

两种方案都严格遵循了你“使用$middlewareGroups而非$routeMiddleware”的要求,选适合你Laravel版本的就行~

内容的提问来源于stack exchange,提问作者erezt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:45:38