- 1. 概要
- 2. 対策
- 3. 参考サイト
1. 概要
表題のエラーが発生したのですが。
「クライアントが短時間にサーバーへ送りすぎたリクエストをサーバーが拒否する際に発生するエラー」です。
これは、身に覚えがありまして。
内部処理で、他の装置とのやり取りが頻発して、自分の内部で折り返して、「api」を多投しておるです。
なので、「DOS」攻撃でもないので、エラーにはしたくないんだな。
2. 対策
送り元は、自分とわかっているので、自分でアドレスであれば、「429」を返さないようにします。
「Laravel」所有者権限で、ドキュメントルートで。
vi app/Providers/RouteServiceProvider.php
「Laravel Framework 10.49.0」の場合、デフォルトで下記のように記述されています。
<?php
namespace App\Providers;
use Illuminate\Cache\RateLimiting\Limit;
use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\RateLimiter;
use Illuminate\Support\Facades\Route;
class RouteServiceProvider extends ServiceProvider
{
/**
* The path to your application's "home" route.
*
* Typically, users are redirected here after authentication.
*
* @var string
*/
public const HOME = '/home';
/**
* Define your route model bindings, pattern filters, and other route configuration.
*/
public function boot(): void
{
RateLimiter::for('api', function (Request $request) {
return Limit::perMinute(60)->by($request->user()?->id ?: $request->ip());
});
$this->routes(function () {
Route::middleware('api')
->prefix('api')
->group(base_path('routes/api.php'));
Route::middleware('web')
->group(base_path('routes/web.php'));
});
}
}
いじるのは、下記の部分です。
RateLimiter::for('api', function (Request $request) {
return Limit::perMinute(60)->by($request->user()?->id ?: $request->ip());
});
この記述は、「Laravel 10」の標準「API」レートリミットが有効であり、未認証時は「IP」アドレス単位で 1 分あたり 60 リクエストを超えると 429 が返ります。
ここを、下記のように変更します。
RateLimiter::for('api', function (Request $request)
{
$whitelist = [ '127.0.0.1', ];
if (in_array($request->ip(), $whitelist, true))
{
return Limit::none();
}
return Limit::perMinute(60)->by($request->user()?->id ?: $request->ip());
});
ここでは、「127.0.0.1」をホワイトリストに追加しています。
「$whitelist」に、許可したい「IP」アドレスを列挙しておけば、そのアドレスからのリクエストにはレートリミットが適用されなくなります。
3. 参考サイト
本ページは、「ChatGPT」軍曹および「Gemini」伍長を参考にさせていただきました。
|