laravel限流中间件必须显式绑定到控制器路由才生效,闭包路由、资源路由未显式指定方法时不触发;真实ip需nginx透传并信任x-real-ip;缓存驱动必须为redis,否则高并发下失效。

限流中间件必须挂载在路由分组或全局中间件里,否则根本不会执行;throttle 默认只对显式绑定控制器方法的路由生效,闭包路由、资源路由未显式绑定、Route::any + 闭包全都不触发。
throttle中间件为什么加了也不限流
常见现象是写了 ->middleware('throttle:60,1'),但接口照刷不误,响应头都正常返回,就是不限制。核心原因就三个:
- 路由没绑定控制器:只有
Route::get('api/user', 'Api/UserController@index')这种写法才生效;Route::get('api/user', function(){})或资源路由Route::resource('user', 'UserController')(没显式指定方法)都不走限流逻辑 -
$request->ip()拿到的是127.0.0.1:Nginx + PHP-FPM 架构下,默认取不到真实客户端 IP,所有请求挤在同一个计数器里 - 缓存驱动还在用
file:高并发下文件锁导致计数偏差,生产环境必须切到redis
如何让throttle真正按IP限流
关键不是加中间件,而是确保 IP 获取准确、缓存可靠、键不冲突:
- Nginx 配置必须透传真实 IP:
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')); - 缓存驱动必须设为
redis:检查config/cache.php中default值是否为'redis',并确认config/redis.php连接可用 - 避免键冲突:RESTful 路由如
GET /users和GET /posts若共用index方法,默认共享计数器;需手动加第三个参数区分:->middleware('throttle:30,1,users')
自定义Redis+Lua令牌桶中间件的关键点
手写中间件比依赖扩展更可控,尤其适合按用户 ID 或接口路径做细粒度限流:
- 必须用
Redis::connection()显式获取连接,别用Cache::store('redis')—— 后者不支持eval和原子命令 - key 要唯一:建议组合
$request->userId() ?: $request->ip()+$request->rule(),避免所有人共用一个桶 - Lua 脚本里所有
ARGV都是字符串,tonumber()必须手动调,否则if remaining > 0永远为 false - 脚本要返回两个值:
{ allow ? 1 : 0, tonumber(remaining) },方便调试时判断是桶空了还是漏刷了 - 首次访问用
redis.call('setex', KEYS[1], ARGV[2], ARGV[1])初始化满桶,别分开incr+expire—— 非原子操作在高并发下会丢令牌或 key 永不过期
限流策略该配在哪一层
不能只在控制器 __construct() 或 initialize() 里手动判断 —— 中间件机制已被绕过,缓存 key 容易错乱,业务逻辑也已执行一半:
- 全局中间件(
app/middleware.php)适合全站统一限流,比如所有 API 接口默认 100 次/分钟 - 路由分组中间件更适合差异化策略,例如
api分组配100,1,pay分组配5,1 - 动态策略推荐从路由 option 注入:
Route::get('api/data', 'Api/Data.index')->option(['rate_limit' => ['max' => 20, 'per' => 60]]),中间件里用$request->routeInfo()[2]['option']['rate_limit'] ?? null读取
最常被忽略的是 throttle:60,1 第二个参数单位——它是秒,不是分钟;写成 throttle:60,60 就变成每小时 60 次,窗口拉得太长,看起来像没限流。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











