首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >仅经过一次尝试,Laravel速率限制器就错误地限制了访问

问仅经过一次尝试,Laravel速率限制器就错误地限制了访问
EN

Stack Overflow用户
提问于 2022-01-23 09:51:16
回答 4查看 1.3K关注 0票数 6

我和Laravel5.8一起工作,我想设置一个速率限制器,限制每分钟的访问和IP地址。

所以我把这个添加到RouteServiceProvider.php中

代码语言:javascript
复制
protected function configureRateLimiting()
    {
        RateLimiter::for('limited', function (Request $request) {
            return [
                Limit::perMinute(500),
                Limit::perMinute(20)->by($request->ip()),
            ];
        });
    }

然后把它应用到公路上:

代码语言:javascript
复制
Route::get("/", "StaticPages\HomeController@show")->middleware('throttle:limited')->name('home');

因此,在尝试500次或从同一IP地址尝试20次之后,应该限制访问。

但现在的问题是,它显示了429太多的请求,只需一次尝试!

我不知道为什么只有一次尝试就限制了访问权限。

那么这里出了什么问题?

如何正确地将基于IP地址的限制设置为每分钟20和500次请求?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2022-02-28 09:47:09

我相信您在试图在Laravel中实现请求速率限制器时阅读了错误的文档。“命名节流阀”只是从版本8开始引入的。它在5.8版上是不可用的,请参阅特定版本的拉拉文件。

如果您以下列方式声明节流阀:

代码语言:javascript
复制
 Route::get("/", "StaticPages\HomeController@show")->middleware('throttle:20,1')->name('home');

您可以在返回的HTTP头上看到第一个请求之后的x-ratelimit-remaining 19。因此,速率限制的工作,它应该是。但是,如果放置throttle:limited,它就无法理解它意味着什么并返回-- x-ratelimit-remaining的返回值为1--这就是为什么您可以打开页面一次并为后续请求返回HTTP 429。

如果您对我的解释仍有疑问,请将die()放在configureRateLimiting开头:

代码语言:javascript
复制
protected function configureRateLimiting()
{
    die();
    RateLimiter::for('limited', function (Request $request) {
        return [
            Limit::perMinute(500),
            Limit::perMinute(20)->by($request->ip()),
        ];
    });
}

如果这个特定的功能实际上是由Laravel执行的,您的应用程序应该停止工作,然后它才能回答任何请求。如果不是的话,它就会运行得很好。

此时,您只有两个实现速率限制器策略的选项: 1)实现您自己的速率限制器中间件;2)将您的Laravel更新到至少8版。

Fyi,在Laravel文档页面的右上角,您可以设置要阅读的文档的哪个版本。

票数 3
EN

Stack Overflow用户

发布于 2022-02-27 09:57:31

我认为您需要在函数中编写代码返回响应(‘Custom.’,429)。

代码语言:javascript
复制
RateLimiter::for('limited', function (Request $request) {
    
    return Limit::perMinute(1000)->response(function () {
    return response('Custom response...', 429);

});

有关速率限制的更多信息:

https://laravel.com/docs/8.x/routing#rate-limiting

票数 1
EN

Stack Overflow用户

发布于 2022-03-04 02:04:54

我同意@Bagus Tesa。除了max_rate和per_minutes之外,Laravel5.8节流中间件不接受参数。在Laravel 8中引入了命名速率限制,并且仅在>= Laravel 8版本中提供。您可以实现自己的速率限制中间件,或者升级到Laravel 8以实现预期的功能。

参考:https://laravel.com/docs/5.8/routing#rate-limiting

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70820870

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档