laravel 11限流必须基于ratelimiter门面配置命名策略、强制使用redis缓存、显式绑定throttle:api中间件且auth前置;旧版throttle:60,1失效,响应头缺失多因cache_driver未设为redis。

升级 Laravel 11 后,原有 API 限流逻辑可能完全失效,因为速率限制已彻底重构为基于 RateLimiter 门面的声明式策略,不再识别旧版 throttle:60,1 这类硬编码参数,且强制依赖 Redis 缓存与显式中间件绑定顺序。
确认当前限流是否真正启用
执行 php artisan route:list --middleware=throttle,检查目标 API 路由是否明确列出 throttle 中间件;若无输出,说明未正确注册或中间件名拼写错误。
用 curl -I https://your.app/api/test 触发一次请求,观察响应头是否包含 X-RateLimit-Limit 和 X-RateLimit-Remaining;【若缺失这两个头,90% 是 CACHE_DRIVER 仍为 file 或 array】,限流计数每次请求都会重置,形同虚设。
在 RouteServiceProvider 中定义命名限流策略
打开 app/Providers/RouteServiceProvider.php,在 configureRateLimiting() 方法内添加策略:
方法一:基础游客/登录用户分离
使用 RateLimiter::for('api', fn($request) => $request->user() ? Limit::perMinute(100)->by($request->user()->id) : Limit::perMinute(10)->by($request->ip()));
方法二:按用户角色差异化配额
RateLimiter::for('api', function (Request $request) {
if ($request->user()?->role === 'vip') {
return Limit::perMinute(500)->by($request->user()->id);
} elseif ($request->user()) {
return Limit::perMinute(60)->by($request->user()->id);
} else {
return Limit::perMinute(15)->by($request->ip());
}
});
注意:by() 的值必须是字符串,且不能含空格或特殊符号;若用 $request->bearerToken(),务必先 hash 截断,否则 Redis key 会超长报错。
在路由中正确绑定 throttle 中间件
第一步:确保认证中间件前置
Route::middleware(['auth:sanctum', 'throttle:api'])->get('/profile', [ProfileController::class, 'show']);
auth:sanctum 必须排在 throttle:api 前面,否则 $request->user() 为 null,策略自动 fallback 到 IP 限流,导致登录用户被误限。
第二步:禁用 web 组中的 throttle
绝不要把 throttle:api 加到 web 中间件组里——web 默认不启用 session+cache 协同机制,限流将静默失效,且无任何日志提示。
第三步:避免硬编码形式
禁止写 Route::middleware('throttle:60,1'),它绕过 RateLimiter::for('api', ...) 的全部动态逻辑,后续策略变更时极易遗漏同步,维护成本陡增。
验证缓存与响应头配置
检查 .env 文件中 CACHE_DRIVER=redis,且 REDIS_CLIENT=predis 或 phpredis 已正确安装;【file 或 array 驱动会导致限流完全失效】。
打开 config/cors.php,确认 'expose' 数组包含 'X-RateLimit-Limit', 'X-RateLimit-Remaining', 'Retry-After';否则前端 JavaScript 无法读取限流状态,无法做友好提示。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











