Laravel限流怎么配置_Laravel Rate Limiting接口访问限制

发布时间 - 2025-11-28 00:00:00    点击率:
Laravel内置限流机制可通过throttle中间件实现,支持按请求频率、用户身份、IP或API Key进行限制,结合RateLimiter可自定义规则,如游客每分钟10次、登录用户100次,超出则返回429状态码,有效防护接口滥用。

Laravel 提供了简单而强大的限流机制,可以轻松对接口访问频率进行控制,防止恶意刷接口或过度请求。你不需要额外安装包,Laravel 自带基于 Redis 的限流支持,结合中间件即可快速实现。

1. 使用内置的限流中间件 throttle

Laravel 内置 throttle 中间件,可以在路由或控制器中直接使用。基本语法是 throttle:最大请求数,分钟数

例如,在 routes/api.php 中限制某个接口每分钟最多访问 60 次:

Route::get('/data', function () {
return response()->json(['message' => 'OK']);
})->middleware('throttle:60,1');

也可以限制更长时间,比如每小时最多 1000 次:
->middleware('throttle:1000,60')

2. 按用户身份限流(登录用户)

如果希望针对已登录用户进行限流,Laravel 会自动使用用户的唯一标识(如 ID)作为限流键,避免所有用户共享同一个限制。

只需确保你的路由在 auth:api 保护下:

Route::middleware(['auth:api', 'throttle:100,60'])->group(function () {
Route::get('/user/data', 'UserDataController@index');
});

这样每个登录用户每分钟最多请求 100 次。

3. 区分游客和登录用户的不同策略

Laravel 支持使用 漏桶算法 并通过 RateLimiter 门面自定义复杂规则。在 App\Providers\RouteServiceProviderconfigureRateLimiting() 方法中配置。

例如:游客每分钟最多 10 次,登录用户每分钟 100 次:

use Illuminate\Cache\RateLimiting\Limit;
use Illuminate\Support\Facades\RateLimiter;

RateLimiter::for('api', function ($request) {
if ($request->user()) {
return Limit::perMinute(100);
}
return Limit::perMinute(10)->by($request->ip());
});

然后在路由中使用:
Route::middleware('throttle:api')->group(...)

4. 自定义限流键(如按 IP 或 API Key)

如果不依赖登录状态,可以通过 IP 地址限流:

RateLimiter::for('api-by-ip', function ($request) {
return Limit::perMinute(20)->by($request->ip());
});

也可以结合请求头中的 API Key 进行限流:

->by($request->header('API-Key'))

5. 返回响应与错误处理

超出限制后,Laravel 会自动返回状态码 429,并附带 Retry-After 头部提示重试时间。你可以自定义异常响应,在 App\Exceptions\Handler 中处理 TooManyRequestsException

基本上就这些。Laravel 的限流机制灵活且开箱即用,合理配置能有效保护你的 API 接口。


# php  # laravel  # redis  # js  # json  # cad  # app  # 路由  # 状态码  # red  # 中间件  # if  # for  # 接口  # function  # 算法  # 最多  # 每分钟  # 自定义  # 你可以  # 只需  # 你不  # 可以通过  # 自带  # 可通过  # 每小时 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel怎么使用artisan命令缓存配置和视图  Laravel DB事务怎么使用_Laravel数据库事务回滚操作  Laravel的.env文件有什么用_Laravel环境变量配置与管理详解  HTML5打空格有哪些误区_新手常犯的空格使用错误【技巧】  微博html5版本怎么弄发超话_超话进入入口及发帖格式要求【教程】  Laravel怎么为数据库表字段添加索引以优化查询  Laravel怎么使用Markdown渲染文档_Laravel将Markdown内容转HTML页面展示【实战】  东莞专业网站制作公司有哪些,东莞招聘网站哪个好?  使用Dockerfile构建java web环境  如何快速查询网站的真实建站时间?  Laravel如何清理系统缓存命令_Laravel清除路由配置及视图缓存的方法【总结】  详解Huffman编码算法之Java实现  如何在Windows服务器上快速搭建网站?  北京网页设计制作网站有哪些,继续教育自动播放怎么设置?  如何快速搭建高效可靠的建站解决方案?  百度浏览器ai对话怎么关 百度浏览器ai聊天窗口隐藏  Win11怎么设置默认图片查看器_Windows11照片应用关联设置  Laravel如何生成URL和重定向?(路由助手函数)  Laravel如何集成第三方登录_Laravel Socialite实现微信QQ微博登录  JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)  如何获取PHP WAP自助建站系统源码?  Bootstrap整体框架之JavaScript插件架构  简历在线制作网站免费版,如何创建个人简历?  Laravel Asset编译怎么配置_Laravel Vite前端构建工具使用  Windows家庭版如何开启组策略(gpedit.msc)?(安装方法)  简单实现Android验证码  电商网站制作价格怎么算,网上拍卖流程以及规则?  html5的keygen标签为什么废弃_替代方案说明【解答】  Laravel如何发送邮件和通知_Laravel邮件与通知系统发送步骤  微信小程序 配置文件详细介绍  高端网站建设与定制开发一站式解决方案 中企动力  JS中对数组元素进行增删改移的方法总结  Laravel如何理解并使用服务容器(Service Container)_Laravel依赖注入与容器绑定说明  php485函数参数是什么意思_php485各参数详细说明【介绍】  百度浏览器如何管理插件 百度浏览器插件管理方法  Laravel的契約(Contracts)是什么_深入理解Laravel Contracts与依赖倒置  Laravel怎么判断请求类型_Laravel Request isMethod用法  Laravel怎么生成URL_Laravel路由命名与URL生成函数详解  5种Android数据存储方式汇总  大学网站设计制作软件有哪些,如何将网站制作成自己app?  PHP 实现电台节目表的智能时间匹配与今日/明日轮播逻辑  HTML5空格和margin有啥区别_空格与外边距的使用场景【说明】  Laravel如何使用Scope本地作用域_Laravel模型常用查询逻辑封装技巧【手册】  如何在云主机上快速搭建多站点网站?  js实现获取鼠标当前的位置  Android GridView 滑动条设置一直显示状态(推荐)  Laravel如何使用.env文件管理环境变量?(最佳实践)  浅谈javascript alert和confirm的美化  Laravel怎么写单元测试_PHPUnit在Laravel项目中的基础测试入门  MySQL查询结果复制到新表的方法(更新、插入)