限流中间件失效的三大原因是路由未显式绑定控制器、$request->ip()返回127.0.0.1(nginx未透传真实ip)、缓存驱动仍为file;需改用redis、配置trusted_proxies、启用全局中间件或路由分组绑定。

限流中间件加了但接口照刷不误,不是配置错了,是三个关键点没对齐:路由没绑定控制器、$request->ip()拿的是127.0.0.1、缓存还在用file驱动。
throttle中间件为什么挂了也不生效
它只对显式绑定控制器方法的路由起作用,比如Route::get('api/user', 'Api/User.index');闭包路由、资源路由未显式绑定、Route::any() + 闭包,全都不触发。
- 必须在路由分组或全局中间件启用:
use_global_middleware设为true,或在app/route/app.php里用Route::group('api', ...)->middleware('throttle:60,1') -
throttle:60,1第二个参数单位是「分钟」,写成throttle:60,60就变成每小时60次,窗口拉太长,看起来像没限 - 中间件执行时机在路由匹配后、控制器执行前——千万别塞进
__construct()或initialize()里手动调,那等于绕过整个机制
Nginx透传真实IP才能让限流按人算
默认$request->ip()在Nginx+PHP-FPM架构下返回的是反向代理地址,所有请求挤在一个计数器里,限流形同虚设。
- Nginx配置必须加两行:
proxy_set_header X-Real-IP $remote_addr;和proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - PHP层只信任
X-Real-IP,别无脑用X-Forwarded-For(可伪造);可在前置中间件里标准化:$request = $request->withHeader('X-Real-IP', $request->header('x-real-ip')); - 多级代理(如CDN + Nginx)时,
X-Forwarded-For可能是一串逗号分隔IP,得清洗:只取第一个非私有地址(排除127.0.0.1、10.0.0.0/8等) - 确认
config/app.php中trusted_proxies已填入你的代理网段,否则框架不会自动解析
Redis缓存和原子性是高并发下不失效的底线
用file缓存驱动在生产环境必然出问题:文件锁导致计数偏差,incr操作丢数据,限流直接失效。
- 必须把
config/cache.php里的default切到redis,并验证config/redis.php连接可用 - 需要精确控制(比如按用户ID限流),就别用默认
throttle,继承think\middleware\RateLimit重写getLimitedId(),返回类似$request->user()->id ?? $request->ip() . '_' . $request->rule() - 要彻底规避并发超限,就得手写Redis+Lua脚本:用
Redis::eval()保证「读余量→判断→扣减」三步原子性;注意Lua里所有ARGV都是字符串,tonumber()必须手动转,否则if remaining > 0永远为false - key设计要带业务标识,比如
rate_limit:user_123:/api/order,避免所有人共享一个桶
单接口独立限流怎么配才不串锅
多个路由共用同一控制器方法(如RESTful的index同时响应/users和/posts),默认会共享计数器——这不是bug,是设计如此,但常被误认为“限流没起作用”。
- 最稳妥的做法是在路由定义时用
option注入策略:->option(['rate_limit' => ['max' => 30, 'per' => 60]]) - 中间件里通过
$request->routeInfo()[2]['option']['rate_limit'] ?? null动态读取,没配的接口默认不限流 - 如果硬编码在中间件里,加个新接口就得改代码,维护成本陡增
- 自定义key后缀也能临时解决:比如
->middleware('throttle:30,1,users'),第三个参数就是key后缀,避免冲突
真正难的不是写代码,是确认Nginx头透传是否生效、Redis连接是否稳定、路由绑定方式是否匹配框架执行链路——这三个点任何一个断掉,限流就只是个摆设。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











