【问题标题】:Laravel 5.4 - Override API 'throttle:60,1'Laravel 5.4 - 覆盖 API 'throttle:60,1'
【发布时间】:2017-10-27 09:17:48
【问题描述】:

我正在编写大量 API 来获取和存储数据。
我喜欢默认的throttle 选项:

protected $middlewareGroups = [
    'api' => [
        'throttle:60,1',
        'bindings',
    ],
];

将请求限制为每分钟 60 个;但是对于某些路线(es:POST),我想增加这个值。

我尝试在路由中间件上设置'throttle:500,1',如下所示:

Route::group(function () {
        Route::get('semaphore/1',        ['uses' => 'App\Api\V1\DBs\SemaphoreController@index']);
        Route::post('semaphore/1',       ['uses' => 'App\Api\V1\DBs\SemaphoreController@store',        'middleware' => 'WriteToDatabaseMiddleware', 'throttle:500,1']);
});

但它不起作用。

有什么想法吗?

谢谢。

更新:
我注意到api.php 路由中使用的'throttle:500,1' 将在Kernel.php 文件中指定的默认'throttle:60,1' 之后设置;然后,它不起作用。

记录流程执行,第一次调用是:

Illuminate\Routing\Middleware\ThrottleRequests -> handle

来自Kernel.phpmaxAttempts=60

那么,第二次调用是:

Illuminate\Routing\Middleware\ThrottleRequests -> handle

来自api.phpmaxAttempts=500

换句话说,api.php 文件中的throttle:500,1 不会覆盖Kernel.php 文件中的throttle:60,1

【问题讨论】:

    标签: php laravel-5.4 throttling


    【解决方案1】:

    当前答案

    根据this GitHub issue,油门中间件不应该“两次”使用(就像你想那样做)。只有两种方法可以“正确”处理您当前的问题:

    1. 编写自己的节流中间件

    1. 为每个路由(组)单独定义油门中间件

    旧答案

    您设置的中间件密钥错误!声明多个要使用的中间件时,为它们创建一个新数组

    ['middleware' => ['WriteToDatabaseMiddleware','throttle:500,1']]
    

    编辑:由于中间件顺序,您应该将内核节流设置为您要使用的最高值,以及所有其他应该有 将油门值降低到相应的值。

    【讨论】:

    • 不客气@vlauciani 如果您能接受答案,那就太好了,因为它解决了您的问题:)
    • 我测试了我的代码,但它不起作用;我已经通过调查更新了我的问题。
    • @vlauciani 好吧,那么您应该将内核值更改为throttle:500,1(更高的值),并将所有其他应该有节流阀的路由更改为throttle:60,1。这应该适用于请求顺序。
    • 是的,你的解决方案是我的主意......问题是,使用这种方法,所有路由都将设置为500;我要记住将每条新路线设置为60。我更喜欢有一个标准值(例如:60)并覆盖到 500 仅特定路线。
    • 谢谢@manniL,我现在读到了“当前答案”。好的,它阐明了操作;我认为解决方案是创建我自己的节流中间件。再次感谢您。
    【解决方案2】:

    在 laravel 6 中,您可以使用前缀来阻止全局限制。 使用'throttle:5,1,prefix'

    Route::group(['prefix' => 'contact-us', 'middleware' => 'throttle:5,1,contact-form',], function () {
        Route::post('/', 'ContactUsController@store');
    });
    

    Allow multiple throttles by naming

    【讨论】:

    • Laravel 5.9?你是说 Laravel 6。在 5.8 之后,Laravel 从 6.0.0 版本开始进行语义版本控制。
    • 您好 Andrew,5.9 版是错误的,请修正我的答案。如果你想在油门中间件中使用前缀,这个拉取请求可能会帮助你Allow multiple throttles by naming
    【解决方案3】:

    目前的答案都没有解释 Laravel 5.x 的行为。在那个版本中,每个“节流”实例都使用相同的存储桶。因此,如果您将油门命令放在两个不同的位置,它会影响每个实例。

    考虑:

    // User can email 5 times an hour
    Route::post('/email', 'Ctrl@email')->middleware('throttle:5,60');
    // User can search 100 times an hour
    Route::get('/search', 'Ctrl@search')->middleware('throttle:100,60);
    

    如果用户在 5 分钟内搜索 5 次,他们将无法在接下来的一个小时内发送电子邮件。

    在 Laravel 5.x 中没有办法解决这个问题。在 Laravel 6 及以上版本they added the ability to name throttles 中,为它们提供了单独的存储桶。

    【讨论】:

      猜你喜欢
      • 2017-05-02
      • 2017-10-19
      • 2019-02-22
      • 2017-08-30
      • 1970-01-01
      • 2017-11-27
      • 2018-04-25
      • 2018-04-08
      • 1970-01-01
      相关资源
      最近更新 更多