1、訪問頻率限制概述
頻率限制經常用在API中,用於限制獨立要求者對特定API的請求頻率。例如,如果設定頻率限制為每分鐘1000次,如果一分鐘內超過這個限制,那麼伺服器就會返回 429: Too Many Attempts. 響應。
通常,一個編碼良好的、實現了頻率限制的應用還會回傳三個回應標頭: X-RateLimit-Limit , X-RateLimit-Remaining 和 Retry-After (如果達到限制次數只能擷取到 Retry-After 頭)。 X-RateLimit-Limit 告訴我們在指定時間內允許的最大請求次數, X-RateLimit-Remaining 指的是在指定時間段內剩下的請求次數, Retry-After 指的是距離下次重試請求需要等待的時間(s)。
注意:每個API都會選擇一個自己的頻率限制時間跨度,GitHub選擇的是1小時,Twitter選擇的是15分鐘,Laravel中介軟體選擇的是1分鐘。
2、如何使用Laravel的訪問頻率限制中介軟體
在Laravel5.2的新特性中,你可以使用一個新的中介軟體 throttle ,讓我們先來看看這個中介軟體的用法,首先我們定義一個路由規則如下:
Route::group(['prefix'=>'api'],function(){ Route::get('users',function(){ return \App\User::all(); });});
然後我們將中介軟體 throttle 添加到其中, throttle 預設限制每分鐘嘗試60次,並且在一分鐘內訪問次數達到60次後禁止訪問:
Route::group(['prefix'=>'api','middleware'=>'throttle'],function(){ Route::get('users',function(){ return \App\User::all(); });});
如果你訪問 api/users 路由,就會看到回應標頭如下所示:
該響應意味著:
- 請求成功(狀態代碼為200)
- 每分鐘只能訪問60次
- 在本時間段內還能訪問57次
如果訪問次數超過60次,回應標頭如下:
同時,響應內容文本為:Too Many Attempts。
如果44s後重試,頁面恢複正常訪問。
3、自訂throttle中介軟體
讓我們來做一點自訂,現在我們想要限制每分鐘訪問5次:
Route::group(['prefix'=>'api','middleware'=>'throttle:5'],function(){ Route::get('users',function(){ return \App\User::all(); });});
如果我們想要改變達到指定限制次數後的等待時間,可以這樣自訂:
Route::group(['prefix'=>'api','middleware'=>'throttle:5,10'],function(){ Route::get('users',function(){ return \App\User::all(); });});