我的路線聲明如下:Route::group(['prefix' => 'media', 'middleware' => 'auth'], function() { Route::group(['middleware' => 'throttle:120,1'], function() { Route::get('/', 'MediaController@index'); // <-- Route in question Route::delete('/{id}', 'MediaController@delete'); Route::patch('/{id}', 'MediaController@edit'); }); Route::post('/', 'MediaController@upload')->middleware('throttle:100,1440');});如果我正確理解了限制中間件,當用戶達到速率限制(1 分鐘內 120 個請求)時,他應該在 1 分鐘的剩余時間內受到限制,然后解除阻塞。但是,阻塞時間高于 1 分鐘。見retry-after標題:(當我第一次注意到它時,它超過了 600 秒,所以并不總是 180 秒)任何想法為什么它會高于 1 分鐘?
2 回答

弒天下
TA貢獻1818條經驗 獲得超8個贊
標retry-after
頭與速率限制無關。所有與速率限制相關的標頭都以x-ratelimit-
. 標頭x-ratelimit-reset
是您要查找的內容:限制何時重置的時間戳。這應該在下一分鐘內(或您設置的任何時間段)

慕虎7371278
TA貢獻1802條經驗 獲得超4個贊
我想到了!
原來throttle
中間件的默認行為不適用于每個路由。它只是限制每個登錄用戶的請求。如您所見,我有一條路線(上傳路線)具有throttle:100,1440
,這會導致問題導致更長的“懲罰”,即使對于具有throttle:120,1
.
我的解決方案: 我編寫了自己的ThrottleRequests.php
中間件版本,適用于每個路由:
將此文件放在您的
app/Http/Middleware
文件夾中。app/Http/Kernel.php
將油門路由中間件更改為新的中間件:
'throttle' => \App\Http\Middleware\ThrottleRequestsPerRoute::class,
現在,每當您分配
throttle
中間件時,它都會按路由工作。
另一種解決方案: 您也可以使用默認中間件并使用第三個參數。您可以傳遞這樣的前綴參數:throttle:100,1440,upload
. 它將上傳前綴分配給限制鍵并基于此限制請求的速率。但是,要實現每條路由的速率限制,您必須為每條路由分配不同的前綴。
- 2 回答
- 0 關注
- 120 瀏覽
添加回答
舉報
0/150
提交
取消