ThrottleRequests中间件需正确配置才能生效:必须加入对应中间件组(如API路由需手动添加)、使用throttle:60,1格式参数、确保Redis缓存驱动启用,并自定义resolveRequestSignature()实现精准限流。
ThrottleRequests 中间件怎么配才真正生效
默认的
中间件只对「已认证用户」或「IP 地址」限流,但很多人配完发现没效果——根本原因是没把它加到正确的中间件组里,或者路由没走这个中间件。
常见错误现象:
从不出现,哪怕狂刷接口;或者只对登录用户限流,游客完全不受控。
必须确保路由用了
这类中间件别名,或显式调用
如果用的是 API 路由(
),默认中间件组不含
,得手动加:在
的
里插入
参数格式是
(60 次/1 分钟),不是
或
—— 第二个参数单位是「分钟」,不是秒
Laravel 9+ 的速率限制键(key)怎么自定义
默认按 IP 限流太粗暴:NAT 环境下一群用户共用一个 IP,容易误杀;想按用户 ID、API token 或请求头区分?得重写
方法。
使用场景:后台管理接口想对每个管理员独立限流,或 SaaS 多租户系统按
区分额度。
新建中间件继承
,覆盖
返回值必须是字符串且具备唯一性,比如:
注意不要包含敏感信息(如明文 token),也不要带斜杠或控制字符,否则 Redis 键名会出错
性能影响:每次请求都执行该方法,避免在其中做 DB 查询或远程调用
Redis 配置不对会导致限流完全失效
限流依赖 Laravel 的缓存驱动存储计数器,默认用
驱动,但如果你改过
或
,限流就退化成「单进程有效」——多 worker、多机器时彻底失效。
Laravel 13.2.0
PHP中文网提供Laravel 13.2.0版本下载,Laravel框架 是基于 PHP 8.3+ 的高性能框架,官方推荐通过 Composer 安装。它内置 AI SDK、JSON:API Resources 及原生向量搜索,支持属性驱动开发与队列路由,大幅提升开发效率。相比旧版,13.2.0 优化了缓存 TTL 管理与实时通信,无需 Redis 即可横向扩展。作为现代 Web 开发首选,它兼顾安全与极速体验,助您快速构建企业级应用。
下载
错误现象:本地开发(file 缓存)一切正常,上线后 429 完全不触发;或部分服务器报
。
生产环境必须用
或
,在
设
,并确认
可达
检查 Redis 连接池配置:Laravel 默认用
,若换
,需确保扩展已装且
不干扰
如果用 Laravel Octane,注意
中间件在 Swoole 模式下仍走 Redis,但自定义 key 逻辑不能依赖
(无 session)
测试限流是否生效的可靠方式
别靠浏览器 F5 刷,也别用 Postman 点几次——HTTP 工具默认复用连接、带缓存头,结果不可信。真实压测必须模拟并发、隔离 IP 和 User-Agent。
推荐做法:
用
循环发请求,避免被当成同一来源
写个简单脚本跑 10 个并发:用
(Apache Bench),观察返回状态码分布
直接查 Redis:运行
,看有没有类似
的 key,再
看剩余次数
注意:Laravel 10+ 把 key 前缀从
改为
,旧版监控脚本要同步更新
最容易被忽略的点:中间件顺序。如果
在
或
之后,而你又依赖 session 数据生成 key,那在 API 路由里它根本拿不到 session——因为 API 默认无 session 中间件。
ThrottleRequestsToo Many Requests (429)throttle:60,1app('Illuminate\Routing\Middleware\ThrottleRequests')routes/api.phpthrottleapp/Http/Kernel.php$middlewareGroups['api']\Illuminate\Routing\Middleware\ThrottleRequests::classthrottle:60,1throttle:60/1throttle:60,60resolveRequestSignature()X-Tenant-IDThrottleRequestsresolveRequestSignature()return $request->user()?->id ?: $request->ip().'_'.$request->header('User-Agent')cacheCACHE_DRIVER=filearrayERR max number of clients reachedredismemcached.envCACHE_DRIVER=redisREDIS_HOSTpredisphpredisredis.session_locking_enabledthrottle$request->session()curl -H "User-Agent: test-$(date +%s)" http://your.app/api/testab -n 100 -c 10 http://your.app/api/testredis-cli keys "*throttle*"throttle|127.0.0.1|GET|/api/testhgetallthrottle:throttle|ThrottleRequestsEncryptCookiesStartSession