【问题标题】:Why are requests throttled for more time than specified in the middleware?为什么请求被限制的时间超过了中间件中指定的时间?
【发布时间】:2020-03-18 17:23:52
【问题描述】:

我的路线声明如下:

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 分钟?

【问题讨论】:

  • 尝试油门120,0并回复结果。
  • @user8555937 x-ratelimit-remaining 始终保持在 120 并且请求不会受到限制
  • 120 表示在达到油门限制之前可以发出的请求数量。它没有指定超过它的“惩罚”。
  • 没错。我只是想知道将其设置为120,1 怎么可能比 1 分钟有更大的“惩罚”。
  • 我做了更多的测试,看起来问题是我对不同的路由有不同的节流配置。就像你在这里看到的那样,上传路由有一个 24 小时的限制期,一旦用户点击它,他将在指定的时间内被锁定在所有路由之外。我需要做更多的测试,但看起来限制不是特定于路由的,就像我想的那样。

标签: php laravel laravel-6.2


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我想通了!

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

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

    1. this file 放在您的app/Http/Middleware 文件夹中。
    2. app/Http/Kernel.php 中将油门路由中间件更改为新的:
    'throttle' => \App\Http\Middleware\ThrottleRequestsPerRoute::class,
    
    1. 现在,每当您分配 throttle 中间件时,它都会按路由工作。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-30
      • 2022-01-06
      • 1970-01-01
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      • 2016-04-07
      相关资源
      最近更新 更多