tp限制訪問頻率
阿新 • • 發佈:2022-03-10
作用
通過本中介軟體可限定使用者在一段時間內的訪問次數,可用於保護介面防爬防爆破的目的。
安裝
composer require topthink/think-throttle
安裝後會自動為專案生成 conf/throttle.php
配置檔案,安裝後元件不會自動啟用,需要手動設定。
開啟
元件以中介軟體的方式進行工作,因此它的開啟與其他中介軟體一樣,例如在全域性中介軟體中使用 app/middleware.php
:
<?php return [ \think\middleware\Throttle::class, ];
配置說明
在 config/throttle.php
<?php // 中介軟體配置 return [ // 快取鍵字首,防止鍵值與其他應用衝突 'prefix' => 'throttle_', // 快取的鍵,true 表示使用來源ip 'key' => true, // 要被限制的請求型別, eg: GET POST PUT DELETE HEAD 'visit_method' => ['GET'], // 設定訪問頻率,例如 '10/m' 指的是允許每分鐘請求10次。值 null 表示不限制, eg: null 10/m 20/h 300/d 200/300 'visit_rate'=> '100/m', // 訪問受限時返回的響應 'visit_fail_response' => function (Throttle $throttle, Request $request, int $wait_seconds) { return Response::create('Too many requests, try again after ' . $wait_seconds . ' seconds.')->code(429); },
當配置項滿足以下條件任何一個時,不會限制訪問頻率:
-
key
值為false
或null
-
visit_rate
值為null
。
其中 key
用來設定快取鍵的;而 visit_rate
用來設定訪問頻率,單位可以是秒,分,時,天,例如:1/s
, 10/m
, 98/h
, 100/d
, 也可以是 100/600
(600 秒內最多 100 次請求)。
靈活定製
示例一:針對使用者個體做限制, key
的值可以設為函式,該函式返回新的快取鍵值(需要Session支援),例如:
'key' => function($throttle, $request) { $user_id = $request->session->get('user_id'); return $user_id ; },
例項二:也可以在回撥函式裡針對不同控制器和方法定製生成key,中介軟體會進行轉換:
'key' => function($throttle, $request) { return '__CONTROLLER__/__ACTION__/__IP__'; },
或者直接設定:
'key' => '__CONTROLLER__/__ACTION__/__IP__',
PS:此示例需要本中介軟體在路由中介軟體後啟用,這樣預設的替換功能才會生效。
示例三:允許在閉包內修改本次訪問頻率或臨時更換限流策略:
'key' => function($throttle, $request) { $throttle->setRate('5/m'); // 設定頻率 $throttle->setDriverClass(CounterSlider::class);// 設定限流策略 return true; },
示例四:允許在路由定義中獨立配置(1.3.x 版本支援)
Route::group(function() { //路由註冊 })->middleware(\think\middleware\Throttle::class, [ 'visit_rate' => '20/m', 'key' => '__CONTROLLER__/__ACTION__/__IP__', ]);