ラーラヴェルにおける入れ子要求の絞り込み


私はステージを最初に設定しましょう:あなたは、特定のルートグループ上にグローバルに割り当てられたスロットルミドルウェアを持っているか、または直接にもRouteServiceProvider 特定のファイルからのすべてのルートで.次に、そのグループ内のスロットルミドルウェアを特定のルートに割り当てる(ネストします).グローバルなスロットル値がネストされた値によって上書きされることを期待して、ルートが指定されたより少ない要求(特に、ネストされたスロットルミドルウェアの場合には、予想される2倍の要求)の後にロックされるのに驚くだけです.
私はこのシナリオで自分自身を発見し、いくつかの思考を与えた後、それは意味をなす-ミドルウェアは2回、1つではなく2つのヒットと呼ばれる.(The X-RateLimit-Remaining しかし、どのように我々はこの障害を克服することができますか?
  • 我々は、グローバルスロットルミドルウェアを削除することができますだけで我々はそれを必要とするすべてのルートに適用されます.(まったく繰り返している)
  • おそらく、デフォルトのスロットルミドルウェアを拡張し、スロットルを区別するために何らかの種類の識別子を実装することができます.
  • 幸運なことに、ララベルは既にsolution 我々のため!それは私たちが独立してそれらを使用できるように様々な絞りを接頭辞に2番目のアプローチを使用します.残念ながら、ドキュメンテーションはこれに言及しません、しかし、それはとても簡単です.
    // User can send 1000 requests of any kind in an hour.
    Route::prefix('image')->middleware('auth', 'throttle:1000,60')->group(function() {
        // User can download 10 times a minute.
        Route::post('/download', 'ImageController@download')->middleware('throttle:10,1,minute_download');
        // User can search 100 times an hour
        Route::get('/search', 'ImageController@search')->middleware('throttle:100,60,search');
        // Use default throttle, user can send 1000 images in an hour.
        Route::get('/send', 'ImageController@send');
    });
    
    上のルートグループはauth and throttle ミドルウェアこれらの2つのミドルウェアは、そのグループ内のルートにグローバルと見なされることができます.シナリオによっては、グループ内のいくつかのルートに対して異なるスロットル値を適用することを検討するかもしれません.これは/download and /search ルート-私たちは彼らのためにより低い要求制限を持ちたいです(現在の場合で).私たちは、スロットルミドルウェアに第3の引数を渡すことによってこれを達成します.これは、それらを区別するために使用される接頭辞値ですthrottle:max_requests,period,prefix .
    この機能はlaravel 6.0で紹介されています.以前のバージョンでは、デフォルトのスロットルを拡張し、独自のソリューションを実装する必要があります.
    もともと投稿https://ntsanov.com/blog/nested-request-throttling-in-laravel