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

新手上路,请多包涵

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

但它不起作用。

任何的想法?

谢谢你。

更新:

I noticed that the 'throttle:500,1' used in the api.php route will be set AFTER the default 'throttle:60,1' specified into Kernel.php file;然后,它不起作用。

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

 Illuminate\Routing\Middleware\ThrottleRequests -> handle

来自 Kernel.phpmaxAttempts=60

然后,第二个电话是:

 Illuminate\Routing\Middleware\ThrottleRequests -> handle

来自 api.phpmaxAttempts=500

In others words, the throttle:500,1 in the api.php file do not override the throttle:60,1 in the Kernel.php file.

原文由 vlauciani 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 559
2 个回答

当前答案

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

  1. 自己写一个 节流中间件

或者

  1. 为每条路由(组) 分别 定义throttle中间件

旧答案

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

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

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

原文由 manniL 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

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

通过命名允许多个节流阀

原文由 Ali Yousefi 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏