我的路线声明如下:Route::group(['prefix' => 'media', 'middleware' => 'auth'], function() { Route::group(['middleware' => 'throttle:120,1'], function() { Route::get('/', 'MediaController@index'); // <-- Route in question Route::delete('/{id}', 'MediaController@delete'); Route::patch('/{id}', 'MediaController@edit'); }); Route::post('/', 'MediaController@upload')->middleware('throttle:100,1440');});如果我正确理解了限制中间件,当用户达到速率限制(1 分钟内 120 个请求)时,他应该在 1 分钟的剩余时间内受到限制,然后解除阻塞。但是,阻塞时间高于 1 分钟。见retry-after标题:(当我第一次注意到它时,它超过了 600 秒,所以并不总是 180 秒)任何想法为什么它会高于 1 分钟?
2 回答
弑天下
TA贡献1818条经验 获得超8个赞
标retry-after头与速率限制无关。所有与速率限制相关的标头都以x-ratelimit-. 标头x-ratelimit-reset是您要查找的内容:限制何时重置的时间戳。这应该在下一分钟内(或您设置的任何时间段)
慕虎7371278
TA贡献1802条经验 获得超4个赞
我想到了!
原来throttle中间件的默认行为不适用于每个路由。它只是限制每个登录用户的请求。如您所见,我有一条路线(上传路线)具有throttle:100,1440,这会导致问题导致更长的“惩罚”,即使对于具有throttle:120,1.
我的解决方案: 我编写了自己的ThrottleRequests.php中间件版本,适用于每个路由:
将此文件放在您的
app/Http/Middleware文件夹中。app/Http/Kernel.php将油门路由中间件更改为新的中间件:
'throttle' => \App\Http\Middleware\ThrottleRequestsPerRoute::class,
现在,每当您分配
throttle中间件时,它都会按路由工作。
另一种解决方案: 您也可以使用默认中间件并使用第三个参数。您可以传递这样的前缀参数:throttle:100,1440,upload. 它将上传前缀分配给限制键并基于此限制请求的速率。但是,要实现每条路由的速率限制,您必须为每条路由分配不同的前缀。
- 2 回答
- 0 关注
- 137 浏览
添加回答
举报
0/150
提交
取消
