调整中间件优先级需修改 Kernel.php 中的 $middleware、$middlewareGroups、$middlewarePriority 和 $routeMiddleware 数组顺序,而非仅依赖路由声明顺序;全局、分组、高优先级及路由级中间件执行顺序分别由对应数组位置决定。

在 Laravel 10.x 中,调整中间件优先级的关键不是改路由写法,而是修改 app/Http/Kernel.php 中的声明顺序和优先级数组。中间件执行顺序由框架内核控制,不完全取决于你在路由里写的先后顺序。
全局中间件顺序:改 $middleware 数组
适用于所有请求的中间件(如信任代理、CORS、维护模式拦截)按 $middleware 数组从上到下的顺序执行。越靠前,越早运行。
- 打开
app/Http/Kernel.php - 找到
protected $middleware = [...] - 把需要提前执行的中间件(如
TrustProxies、HandleCors)放在数组顶部 - 把偏业务或依赖会话/认证的中间件(如日志、权限检查)往后放
分组中间件顺序:改 $middlewareGroups 数组
比如 web 或 api 组里的中间件,其内部顺序也由数组位置决定:
-
web组默认含StartSession→Authenticate→VerifyCsrfToken - 若你自定义了
CheckRole,且它必须基于已登录用户运行,就把它加在Authenticate::class后面 - 不要只在路由里写
->middleware(['auth', 'check-role']),那不能保证顺序
确保自定义中间件在 auth 前/后执行:用 $middlewarePriority
当你的中间件与 auth、session 等有状态中间件存在依赖关系时,仅调换数组位置可能不够——Laravel 会对这些中间件自动重排序。这时必须显式干预 $middlewarePriority:
- 该数组定义了「高优先级中间件」的强制执行层级
- 例如子域名校验中间件
Website必须在Authenticate前运行,否则无效子域名会被重定向到登录页而非返回 404 - 在
Kernel.php中添加或修改:protected $middlewarePriority = [\App\Http\Middleware\Website::class,\Illuminate\Session\Middleware\StartSession::class,\Illuminate\Auth\Middleware\Authenticate::class,... // 其他]; - 注意:类名必须带完整命名空间;Laravel 10+ 默认已定义该数组,只需追加或调整位置
路由级中间件顺序:改 $routeMiddleware 声明位置
你在路由中用 ->middleware(['a', 'b']) 指定的中间件,实际执行顺序取决于它们在 $routeMiddleware 数组中的**定义顺序**,而不是调用顺序:
- 找到
protected $routeMiddleware = [...] - 若希望
ensure-user-has-profile总是在auth之后运行,就把它定义在'auth' => ...这一行的下方 - 错误做法:在路由里写
['auth', 'ensure-user-has-profile']却把后者定义在$routeMiddleware数组最前面


















