Estoy trabajando con Laravel 5.8 y quería configurar un limitador de velocidad que limite el acceso a la ruta por minuto y también por dirección IP.
Así que agregué esto a RouteServiceProvider.php :
protected function configureRateLimiting() { RateLimiter::for('limited', function (Request $request) { return [ Limit::perMinute(500), Limit::perMinute(20)->by($request->ip()), ]; }); }Y luego lo aplicó a Route:
Route::get("/", "StaticPages\HomeController@show")->middleware('throttle:limited')->name('home');Por lo tanto, debería limitar el acceso después de 500 intentos o 20 intentos desde la misma dirección IP.
¡Pero ahora el problema es que muestra 429 Demasiadas solicitudes después de solo UN intento!
No sé por qué limita el acceso después de un solo intento.
Entonces, ¿qué está yendo mal aquí?
¿Cómo puedo configurar correctamente la limitación basada en la dirección IP a 20 y 500 solicitudes por minuto?
Creo que ha leído la documentación incorrecta en su intento de implementar un limitador de tasa de solicitud en Laravel. El "acelerador con nombre" solo se introduce a partir de la versión 8. No está disponible en la versión 5.8, consulte la documentación de laravel para esa versión en particular.
Si declaró el acelerador de la siguiente manera:
Route::get("/", "StaticPages\HomeController@show")->middleware('throttle:20,1')->name('home');Puede ver en el encabezado HTTP que regresa que dice x-ratelimit-remaining 19 después de la primera solicitud. Por lo tanto, la limitación de velocidad funciona como se supone que debe ser. Sin embargo, si coloca throttle:limited , no entendería qué significa y devuelve -1 para x-ratelimit-remaining , y es por eso que puede abrir la página una vez y devolver el error HTTP 429 para las solicitudes posteriores.
Si aún tiene dudas sobre mi explicación, coloque un die() al comienzo de configureRateLimiting como tal:
protected function configureRateLimiting() { die(); RateLimiter::for('limited', function (Request $request) { return [ Limit::perMinute(500), Limit::perMinute(20)->by($request->ip()), ]; }); }Si Laravel realmente ejecuta esa función en particular, su aplicación debería dejar de funcionar antes de que pueda responder a cualquier solicitud. Si no es así, simplemente funcionará bien.
En este punto, solo tiene 2 opciones para implementar su política de limitador de velocidad: 1) implementar su propio middleware de limitador de velocidad; 2) actualice su Laravel al menos a la versión 8
Para su información, en la esquina superior derecha de la página de documentación de Laravel, puede establecer qué versión de la documentación desea leer.
Creo que necesitas escribir código [respuesta de retorno('Respuesta personalizada...', 429); ] en funciones.
RateLimiter::for('limited', function (Request $request) { return Limit::perMinute(1000)->response(function () { return response('Custom response...', 429); });Para obtener más información sobre la limitación de velocidad:
Estoy de acuerdo con @Bagus Tesa. El middleware de aceleración de Laravel 5.8 no acepta parámetros excepto max_rate y per_minutes. La limitación de velocidad con nombre se introdujo en Laravel 8 y solo está disponible en versiones >= Laravel 8. Puede implementar su propio middleware de limitación de velocidad o actualizar a Laravel 8 para lograr la funcionalidad esperada.
Consulte: https://laravel.com/docs/5.8/routing#rate-limiting