首页 > 解决方案 > API 速率限制响应无效标头

问题描述

使用 Laravel7。kernel.php 中的全局 api 速率限制设置覆盖了 api 标头响应。例如在 api.php

 api.php 
    Route::get('/test1', function () {
    return 'test777';
})->middleware("throttle:5,1");;

   kernel.php
            'api' => [
                'throttle:60,1',
                \Illuminate\Routing\Middleware\SubstituteBindings::class,
            ],

当达到 5 次尝试的最大限制时,接收 429 个无效标头。应该是 5 次尝试。X-RateLimit-Limit 60 X-RateLimit-剩余 56

需要在 kernel.php 中注释 'throttle:60,1' 以使用正确的 x-rate 标头进行响应。不想评论它,因为所有其他 api 的速率限制为每分钟 60 个请求。有什么替代方法吗?

标签: laravellaravel-7

解决方案


为防止处理速率限制的缓存键发生冲突,如果速率限制与默认值不同,则应为速率限制命名:

Route::get('/test1', function () {
    return 'test777';
})->middleware("throttle:5,1,test1");

这样,用于设置速率限制的缓存键之间就不会发生冲突。

这在“速率限制段”下的文档中进行了描述

请注意,在 Laravel 8 中,这已经改变,现在你也可以configureRateLimiting在你的RouteServiceProvider:


protected function configureRateLimiting()
{
    RateLimiter::for('test1', function (Request $request) {
        return Limit::perMinute(5);
    });
}

然后你可以使用:

Route::get('/test1', function () {
    return 'test777';
})->middleware("throttle:test1");

L8 方法还允许对速率限制进行更多控制,因此如果您需要良好的速率限制功能,则值得考虑升级


推荐阅读