Disable rate limiter in Laravel?

Is there a way to disable rate limiting on every/individual routes in Laravel?

I'm trying to test an endpoint that receives a lot of requests, but randomly Laravel will start responding with { status: 429, responseText: 'Too Many Attempts.' } for a few hundred requests which makes testing a huge pain.

146903 次浏览

In app/Http/Kernel.php Laravel has a default throttle limit for all api routes.

protected $middlewareGroups = [
...
'api' => [
'throttle:60,1',
],
];

评论或增加它。

假设您正在使用 API 路由,那么您可以更改 app/Http/Kernel.php 中的节流阀,或者完全取消它。如果您需要为其他路由节流,您可以分别为它们注册中间件。

(example below: throttle - 60 attempts then locked out for 1 minute)

'api' => [
'throttle:60,1',
'bindings',
],

如果希望仅禁用自动化测试,则可以在测试中使用 WithoutMiddleware trait。

use Illuminate\Foundation\Testing\WithoutMiddleware;


class YourTest extends TestCase {
use WithoutMiddleware;


...

否则,只要从 内核文件(app/Http/Kernel.php)中删除 'throttle:60,1',行,问题就解决了。

您实际上可以在测试中禁用某个中间件 只有

use Illuminate\Routing\Middleware\ThrottleRequests;


class YourTest extends TestCase
{


protected function setUp()
{
parent::setUp();
$this->withoutMiddleware(
ThrottleRequests::class
);
}
...
}

在 Laravel 5.7

动态收费限制 您可以根据已验证用户模型的属性指定动态请求最大值。例如,如果 User 模型包含 rate _ limit 属性,您可以将该属性的名称传递给油门中间件,以便用于计算最大请求计数:

Route::middleware('auth:api', 'throttle:rate_limit,1')->group(function () {
Route::get('/user', function () {
//
});
});

Https://laravel.com/docs/5.7/routing#rate-limiting

A non-hacky way to increase the throttle in unit tests to avoid the dreaded 429:

  1. 从内核文件中间件中删除油门: 60,1。
  2. 将油门中间件重新添加到路由组中,使用一个环境变量代替:
$requestsPerMinute = ENV("REQUESTS_PER_MINUTE", 60);
Route::middleware(["auth:api", "throttle:$requestsPerMinute,1"])->group(function(){
// your routes
});
  1. 在 phPunit.xml 中定义 REQUESTS _ PER _ MINUTE 的环境变量要高得多,以便在调整之前在测试环境中允许更多的请求。
<server name="REQUESTS_PER_MINUTE" value="500"/>
  1. (还要在. env 中定义新的 REQUESTS _ PER _ MINUTE var,即使它会回落到60)。

您可以在 app/Http/Kernel.php中添加以下行

    'api' => [
'throttle:120,1',
'bindings',
\App\Library\Cobalt\Http\Middleware\LogMiddleware::class,
],

如果问题仍然存在,请尝试工匠命令 php artisan cache:clear

您可以使用 cache:clear命令来清除缓存,包括您的速率限制,如下所示:

php artisan cache:clear

如果您正在使用 Laravel 8.x 或更高版本,您可以使用 RateLimiter 并执行以下步骤:

In your app/Providers/RouteServiceProvider.php find below configureRateLimiting:

protected function configureRateLimiting()
{


RateLimiter::for('api', function (Request $request) {
return Limit::perMinute(60)->by(optional($request->user())->id ?: $request->ip());
});


// no limit throttle
RateLimiter::for('none', function (Request $request) {
return Limit::none();
});


}

在你的 app/web.php 中添加“油门: 无:

Route::group(['middleware' => ['auth', 'throttle:none']], function ($router) {
Route::post('test', 'TestController@test');
});

在我的例子中,我只是更改了‘ AppProvidersRouteServiceProvider 中的 perMinute()的默认值。

protected function configureRateLimiting()
{
RateLimiter::for('api', function (Request $request) {
$perMinute = env('APP_ENV') === 'testing' ? 1000 : 60;


return Limit::perMinute($perMinute)
->by(optional($request->user())->id ?: $request->ip());
});
}


可以从 App Http Kernel.php 中删除或注释掉 (throttle:60,1)行。