laravel 11 速率限制器配置更集中、默认更严格、动态键生成更灵活、响应控制更精细:限流统一在 bootstrap/app.php 的 withratelimiting() 中定义,预设 'api'/'web' 策略,自定义需显式注册;默认启用基础限流(60次/分钟),未覆盖则强制生效;键闭包支持请求+参数双参及多维作用域;响应可自定义返回 json 或 response 实例。

Laravel 11 的速率限制器(Rate Limiter)在机制上与 10.x 兼容,但配置方式更集中、语义更明确,不再依赖中间件组或分散的闭包注册;全局限流默认收紧,动态限流支持更灵活的键生成与作用域控制。
限流配置统一收口到 bootstrap/app.php
Laravel 10 中,限流规则通常在 app/Providers/RouteServiceProvider.php 的 configureRateLimiting() 方法中定义,且需手动绑定到路由或中间件。Laravel 11 彻底移除该方法入口,所有限流逻辑必须写在 bootstrap/app.php 的 withRateLimiting() 闭包中:
- 只允许一个全局
RateLimiter::for()注册点,避免多处定义冲突 - 框架内置
'api'和'web'限流键已预设,无需重复声明 - 自定义限流策略名(如
'login')必须显式调用RateLimiter::for('login', ...)才生效
全局限流默认行为更严格
Laravel 10 默认对未显式配置的路由不限流;Laravel 11 在启用 throttle:api 或 throttle:web 中间件时,会强制应用框架预设的基础限流策略(60 次/分钟),除非你主动覆盖:
-
throttle:api→ 默认使用cache|redis存储,键为rate_limit:api:{ip} -
throttle:web→ 默认带 session 绑定,键为rate_limit:web:{session_id} - 若需关闭某类请求的限流,必须在
withRateLimiting()中返回null,例如:if ($request->is('health')) return null;
动态限流支持运行时键生成与多维作用域
两者都支持闭包生成限流键,但 Laravel 11 强化了键的可组合性与上下文感知能力:
- 键闭包参数从
Request $request扩展为(Request $request, array $parameters = []),便于传入路由参数或用户属性 - 支持嵌套作用域:例如按用户角色 + IP + 路由动作生成唯一键
"rate_limit:admin:{$request->ip()}:{$request->route()->getActionName()}" - 可结合缓存标签(Cache Tags)实现分组清理,如
Cache::tags(['rate_limit', 'user_'.$user->id])->flush()(需 Redis 驱动)
限流响应与失败处理更可控
Laravel 11 不再隐式返回 429 响应体,而是将响应构造逻辑完全交由开发者控制:
- 在
RateLimiter::for()闭包中,可直接返回Response实例或 JSON 结构 - 推荐写法:
return response()->json(['message' => 'Too many requests'], 429)->header('Retry-After', 60); - 若使用 API 资源路由,建议搭配
throttle:api中间件,并在控制器中捕获ThrottleRequestsException做定制化处理











