Laravel 5.4 - 覆盖 API 'throttle:60,1'

2022-08-30 16:42:55

我正在编写大量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']);
});

但它不起作用。

有什么想法吗?

谢谢。

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

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

Illuminate\Routing\Middleware\ThrottleRequests -> handle

从 有 .Kernel.phpmaxAttempts=60

然后,第二个调用是:

Illuminate\Routing\Middleware\ThrottleRequests -> handle

从 有 .api.phpmaxAttempts=500

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


答案 1

当前答案

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

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

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

旧答案

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

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

编辑:由于中间件的顺序,您应该将内核限制设置为要使用的最大值,并将所有其他应具有较低限制值的路由设置为相应的路由。


答案 2

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

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

通过命名允许多个限制


推荐