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\AppServiceProvider 的 boot() 方法進行。
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 操作進行精確的計數。
使用 Redis 的優點
- 水平擴展支援 — 可於多個伺服器實例間共享 counter
- 高精度 — 以 atomic 操作防止競爭條件
- TTL 管理 — 以 Redis 原生的有效期限功能自動刪除 counter
相關頁面
Cache
確認包含 Redis 在內的 Laravel Cache Driver 設定與使用方式。