Laravel - 限制特定 API 路由的速率

Posted

技术标签:

【中文标题】Laravel - 限制特定 API 路由的速率【英文标题】:Laravel - Rate Limiting specific API routes 【发布时间】:2019-08-20 14:25:46 【问题描述】:

我目前正在开发一个由 Laravel 驱动的站点,该站点由两个独立的服务器、一个 API 服务器和一个公共 Web 服务器(都运行 Laravel)提供支持。

API 有许多路由,用于验证某些关键术语的可用性,例如电子邮件地址和 URL slug。这些路由通过 AJAX 调用以检查数据库,并在按键时触发。

正如预期的那样,每分钟触发多次 AJAX 请求,API 会引发“请求过多”错误。我知道这可以通过增加请求限制来解决,但是我只想对两条路由执行此操作,而不是所有路由。

如何禁用单个 API 路由的速率限制?

这是其中一条路线,非常标准:

Route::post('/email/is-available', function(Request $request) 

    ...

)->middleware('my_own_api_key_checking_middleware');

非常感谢!

【问题讨论】:

我会使用带有路由中间件的github.com/GrahamCampbell/Laravel-Throttle。 太好了,感谢@namelivia,有什么想法可以禁用而不是增加速率限制吗? 是的,注释掉app/Http/Kernel.php 上的throttle 行。顺便说一句,该包默认集成在最新版本的 laravel 框架上。让我详细说明一下作为答案。 【参考方案1】:

您收到了太多请求消息,因为 Laravel 默认将油门中间件应用于所有 api 路由,要禁用它,请转到 app/Http/Kernel.php 并从属性 $middlewareGroups 中删除或注释 throttle 数组条目,这将禁用组中每条路由的限制。 现在在您的路线文件中将其添加到您想要的路线中:

->middleware('throttle:240,1');

第一个数字是请求的限制,第二个是时间。

【讨论】:

太好了,感谢您的回答!要禁用单个路由的限制,我是否必须禁用所有路由并将限制重新应用于我希望打开限制的所有路由? 哦,这是使用github.com/GrahamCampbell/Laravel-Throttle 吗?如果是这样,请不要忘记在您的答案中包含:) 您可以创建一个中间件组并将您的所有路由放入组中,但您不想限制的路由。

以上是关于Laravel - 限制特定 API 路由的速率的主要内容,如果未能解决你的问题,请参考以下文章

Twitter API - POST收藏夹/创建特定速率限制

如何在 laravel 上限制特定用户的路由

Laravel:如何将某些路由参数限制为特定值?

在 Laravel 中禁用速率限制器?

如何限制特定 API 网关路由的有效负载大小

如何限制/速率限制请求以防止 Axios 出现 429 错误