跳转到主要内容

RateLimiter Facade 的机制

Laravel 的限流由 Illuminate\Cache\RateLimiting\Limit 类与 RateLimiter Facade 组成。内部将计数器保存在缓存驱动中(默认为 file 或 redis),以此追踪请求数。 throttle 中间件对接收到的请求执行由 RateLimiter::for() 定义的闭包,一旦达到限制便返回 429 Too Many Requests

AppServiceProvider 中定义自定义 Limiter

限流配置写在 App\Providers\AppServiceProviderboot() 方法中。
RateLimiter::for() 的第 1 个参数是 Limiter 名,在 throttle 中间件中引用。第 2 个参数的闭包需要返回 Illuminate\Cache\RateLimiting\Limit 实例。

按用户、IP、套餐限流

对已登录用户与访客采用不同限制

根据用户套餐限制

按 IP 全局限流

无论访问哪个端点,都按 IP 限流。

组合多个限制

以数组形式返回时,所有限制都会被评估,只要触达其中之一就返回 429
如果多个限制共享同一 by 值,请为 key 加上前缀以避免冲突。

通过 throttle 中间件指定自定义 Limiter 名

将已定义的 Limiter 名传给 throttle 中间件。

bootstrap/app.php 中注册

Laravel 11 之后,中间件在 bootstrap/app.php 中管理。

应用于 API 路由的示例

1

定义 Limiter

AppServiceProvider 中定义多个 Limiter。
2

将中间件应用到路由

响应头(X-RateLimit-*)机制

throttle 中间件会自动为响应加上限流信息头。

自定义响应

使用 RateLimiter::attempt() 手动检查

若不使用 throttle 中间件,而想在代码任意位置检查限流,可以使用 RateLimiter::attempt()

查询与重置尝试次数

登录节流示例

基于响应的限流

若只想统计特定响应,使用 after()。以下示例只统计 404,用来防止资源枚举攻击:

基于 Redis 的限流

只要把默认缓存驱动改为 Redis,throttle 中间件也会自动使用 Redis。

Redis 驱动配置

使用 throttleWithRedis

若要使用 Redis 专用优化的节流中间件,请在 bootstrap/app.php 中调用 throttleWithRedis()
由此 throttle 中间件会映射到 ThrottleRequestsWithRedis 类,通过 Redis 的原子操作实现精确计数。
使用 throttleWithRedis() 前请确保 Redis 可用。若无法连接 Redis,可能导致所有请求被拒绝。

使用 Redis 的收益

  • 可横向扩展 — 多个服务器实例可共享计数器
  • 高精度 — 原子操作避免竞态
  • TTL 管理 — 利用 Redis 原生过期机制自动清理计数器

相关页面

缓存

了解包含 Redis 在内的 Laravel 缓存驱动的配置与用法。
最后修改于 2026年7月18日