Laravel中API限流需区分全局与单路由配置:全局限流需在app/Http/Kernel.php的api中间件组中添加ThrottleRequests::class.':api';单路由可用throttle:5,1或自定义命名限流器;验证需用Redis/DB缓存、发6次请求查429状态及响应头。

要在Laravel中对API接口实施限流保护,必须区分清楚全局中间件组配置和单个路由配置的生效范围与执行时机——前者影响所有匹配路由组的请求,后者只约束指定端点,混用时顺序错位会导致限流失效或重复触发。
在api中间件组中启用全局限流
打开 app/Http/Kernel.php 文件,定位到 $middlewareGroups 数组中的 'api' 键。
确认该数组已包含 \Illuminate\Routing\Middleware\ThrottleRequests::class.':api' 这一行;若缺失,手动添加到数组开头位置。
这一步不能省略,因为 Laravel 默认的 api 组不自带限流逻辑,仅含模型绑定和基础限流类注册,【缺少 :api 参数会导致限流器无法加载对应策略】。
保存后,所有通过 Route::middleware('api')->group(...) 定义的路由都会自动应用限流规则。
为单个路由单独设置限流阈值
方法一:直接链式调用中间件
在 routes/api.php 中写入:Route::get('/export', [ExportController::class, 'handle'])->middleware('throttle:5,1');
这表示该接口每分钟最多响应 5 次请求,超出即返回 429 状态码。
方法二:使用命名限流器(推荐用于多条件判断)
先在 AppServiceProvider::boot() 中注册自定义限流器:
RateLimiter::for('export-heavy', function ($request) { return $request->user() ? Limit::perHour(30) : Limit::perHour(3)->by($request->ip()); });
再在路由中绑定:->middleware('throttle:export-heavy')。
注意:命名限流器必须在路由注册前完成定义,否则运行时报错 Class 'export-heavy' not found。
验证限流是否生效的三步操作
第一步:启动本地服务并确保缓存驱动为 redis 或 database(file 驱动在并发下可能漏判)。
第二步:用 curl 或 Postman 连续发起 6 次相同 GET 请求到目标接口,观察第 6 次响应头是否含 X-RateLimit-Remaining: 0 和状态码 429。
第三步:清空缓存并修改限流参数,确认新规则在下次请求中立即生效——Laravel 的限流键基于请求路径+用户/IP动态生成,无需重启服务。











