Skip to main content

RateLimiter Facade 的機制

Laravel 的速率限制由 Illuminate\Cache\RateLimiting\Limit 類別與 RateLimiter Facade 構成。內部將 counter 保存於 cache driver(預設為 file 或 Redis),以追蹤請求數。 throttle 中介層對接收到的請求執行以 RateLimiter::for() 定義的 closure,若達到限制便回傳 429 Too Many Requests

AppServiceProvider 定義自訂 Limiter

速率限制的設定於 App\Providers\AppServiceProviderboot() 方法進行。
RateLimiter::for() 的第 1 個引數為 Limiter 名稱,於 throttle 中介層參照時使用。第 2 個引數的 closure 需回傳 Illuminate\Cache\RateLimiting\Limit 實例。

依使用者、IP、方案的速率限制

已驗證使用者與訪客採用不同限制

依使用者方案的限制

依 IP 位址的全域限制

不論特定端點,以 IP 位址為單位進行 throttle。

組合多個限制

若以陣列回傳,所有限制皆會被評估。達到任一者時即回傳 429
若定義多個具有相同 by 值的限制,請加上前綴避免 key 衝突。

throttle 中介層與自訂 Limiter 名稱的指定

將定義的 Limiter 名稱傳入 throttle 中介層。

bootstrap/app.php 註冊

Laravel 11 以後,中介層於 bootstrap/app.php 管理。

API 路由的套用範例

1

定義 Limiter

AppServiceProvider 定義多個 Limiter。
2

於路由套用中介層

Response Header(X-RateLimit-*)的機制

throttle 中介層會自動於 Response Header 附加限制資訊。

回傳自訂 Response

使用 RateLimiter::attempt() 進行手動檢查

若不使用 throttle 中介層,而希望於程式碼中的任意時機檢查速率限制,可使用 RateLimiter::attempt()

嘗試次數的確認與重置

登入 throttle 範例

基於 Response 的速率限制

若希望僅計算特定 Response,可使用 after()。以下為僅計算 404 Response 防止資源列舉攻擊的範例:

使用 Redis 的速率限制

只要將預設 cache driver 變更為 Redis,throttle 中介層也會自動使用 Redis。

Redis Driver 的設定

使用 throttleWithRedis

若要使用 Redis 專用最佳化的 throttle 中介層,於 bootstrap/app.php 呼叫 throttleWithRedis()
如此 throttle 中介層會對應至 ThrottleRequestsWithRedis 類別,使用 Redis 的 atomic 操作進行精確的計數。
使用 throttleWithRedis() 時,請務必確認 Redis 可用。若對 Redis 連線失敗,所有請求可能都會被拒絕。

使用 Redis 的優點

  • 水平擴展支援 — 可於多個伺服器實例間共享 counter
  • 高精度 — 以 atomic 操作防止競爭條件
  • TTL 管理 — 以 Redis 原生的有效期限功能自動刪除 counter

相關頁面

Cache

確認包含 Redis 在內的 Laravel Cache Driver 設定與使用方式。
最後修改於 2026年8月2日