为什么请求被限制的时间超过了中间件中指定的时间?

我的路线声明如下:


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标题:

http://img4.mukewang.com/6364d81d0001eb2213820607.jpg

(当我第一次注意到它时,它超过了 600 秒,所以并不总是 180 秒)

任何想法为什么它会高于 1 分钟?


慕标5832272
浏览 92回答 2
2回答

弑天下

标retry-after头与速率限制无关。所有与速率限制相关的标头都以x-ratelimit-.&nbsp;标头x-ratelimit-reset是您要查找的内容:限制何时重置的时间戳。这应该在下一分钟内(或您设置的任何时间段)

慕虎7371278

我想到了!原来throttle中间件的默认行为不适用于每个路由。它只是限制每个登录用户的请求。如您所见,我有一条路线(上传路线)具有throttle:100,1440,这会导致问题导致更长的“惩罚”,即使对于具有throttle:120,1.我的解决方案:&nbsp;我编写了自己的ThrottleRequests.php中间件版本,适用于每个路由:将此文件放在您的app/Http/Middleware文件夹中。app/Http/Kernel.php将油门路由中间件更改为新的中间件:'throttle'&nbsp;=>&nbsp;\App\Http\Middleware\ThrottleRequestsPerRoute::class,现在,每当您分配throttle中间件时,它都会按路由工作。另一种解决方案:&nbsp;您也可以使用默认中间件并使用第三个参数。您可以传递这样的前缀参数:throttle:100,1440,upload.&nbsp;它将上传前缀分配给限制键并基于此限制请求的速率。但是,要实现每条路由的速率限制,您必须为每条路由分配不同的前缀。
打开App,查看更多内容
随时随地看视频慕课网APP