为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
慕标5832272 2022-11-04 17:12:59
我的路线声明如下: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是您要查找的内容:限制何时重置的时间戳。这应该在下一分钟内(或您设置的任何时间段)



查看完整回答
反对 回复 2022-11-04
?
慕虎7371278

TA贡献1802条经验 获得超4个赞

我想到了!

原来throttle中间件的默认行为不适用于每个路由。它只是限制每个登录用户的请求。如您所见,我有一条路线(上传路线)具有throttle:100,1440,这会导致问题导致更长的“惩罚”,即使对于具有throttle:120,1.

我的解决方案: 我编写了自己的ThrottleRequests.php中间件版本,适用于每个路由:

  1. 将此文件放在您的app/Http/Middleware文件夹中。

  2. app/Http/Kernel.php将油门路由中间件更改为新的中间件:

'throttle' => \App\Http\Middleware\ThrottleRequestsPerRoute::class,
  1. 现在,每当您分配throttle中间件时,它都会按路由工作。

另一种解决方案: 您也可以使用默认中间件并使用第三个参数。您可以传递这样的前缀参数:throttle:100,1440,upload. 它将上传前缀分配给限制键并基于此限制请求的速率。但是,要实现每条路由的速率限制,您必须为每条路由分配不同的前缀。


查看完整回答
反对 回复 2022-11-04
  • 2 回答
  • 0 关注
  • 91 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号