我的路线声明如下: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 关注
- 91 浏览
添加回答
举报
0/150
提交
取消