我和Laravel5.8一起工作,我想设置一个速率限制器,限制每分钟的访问和IP地址。
所以我把这个添加到RouteServiceProvider.php中
protected function configureRateLimiting()
{
RateLimiter::for('limited', function (Request $request) {
return [
Limit::perMinute(500),
Limit::perMinute(20)->by($request->ip()),
];
});
}然后把它应用到公路上:
Route::get("/", "StaticPages\HomeController@show")->middleware('throttle:limited')->name('home');因此,在尝试500次或从同一IP地址尝试20次之后,应该限制访问。
但现在的问题是,它显示了429太多的请求,只需一次尝试!
我不知道为什么只有一次尝试就限制了访问权限。
那么这里出了什么问题?
如何正确地将基于IP地址的限制设置为每分钟20和500次请求?
发布于 2022-02-28 09:47:09
我相信您在试图在Laravel中实现请求速率限制器时阅读了错误的文档。“命名节流阀”只是从版本8开始引入的。它在5.8版上是不可用的,请参阅特定版本的拉拉文件。
如果您以下列方式声明节流阀:
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开头:
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文档页面的右上角,您可以设置要阅读的文档的哪个版本。
发布于 2022-02-27 09:57:31
我认为您需要在函数中编写代码返回响应(‘Custom.’,429)。
RateLimiter::for('limited', function (Request $request) {
return Limit::perMinute(1000)->response(function () {
return response('Custom response...', 429);
});有关速率限制的更多信息:
发布于 2022-03-04 02:04:54
我同意@Bagus Tesa。除了max_rate和per_minutes之外,Laravel5.8节流中间件不接受参数。在Laravel 8中引入了命名速率限制,并且仅在>= Laravel 8版本中提供。您可以实现自己的速率限制中间件,或者升级到Laravel 8以实现预期的功能。
https://stackoverflow.com/questions/70820870
复制相似问题