Ein tiefer Blick auf die Facade RateLimiter — von der Implementierung individueller Rate Limits pro Nutzer, Plan oder IP-Adresse bis hin zu hochverfügbaren Konfigurationen mit Redis.
Das Rate Limiting in Laravel setzt sich aus der Klasse Illuminate\Cache\RateLimiting\Limit und der Facade RateLimiter zusammen. Intern speichert es Zähler im Cache-Treiber (standardmäßig File oder Redis) und verfolgt so die Anzahl der Anfragen.Die Middleware throttle führt für jede Anfrage die per RateLimiter::for() definierte Closure aus und liefert bei Überschreitung 429 Too Many Requests.
Die Rate-Limit-Konfiguration erfolgt in der boot()-Methode von App\Providers\AppServiceProvider.
<?phpnamespace App\Providers;use Illuminate\Cache\RateLimiting\Limit;use Illuminate\Http\Request;use Illuminate\Support\Facades\RateLimiter;use Illuminate\Support\ServiceProvider;class AppServiceProvider extends ServiceProvider{ public function boot(): void { RateLimiter::for('api', function (Request $request) { return Limit::perMinute(60)->by($request->user()?->id ?: $request->ip()); }); }}
Das erste Argument von RateLimiter::for() ist der Limiter-Name, den die Middleware throttle verwendet. Die Closure als zweites Argument muss eine Instanz von Illuminate\Cache\RateLimiting\Limit zurückgeben.
Die Middleware throttle fügt Limit-Infos automatisch als Response-Header an.
Header
Beschreibung
X-RateLimit-Limit
Erlaubte Anfragezahl
X-RateLimit-Remaining
Verbleibende Anfragen
Retry-After
Sekunden bis zur nächsten möglichen Anfrage (nur bei 429)
X-RateLimit-Reset
UNIX-Zeitstempel, an dem das Limit zurückgesetzt wird
HTTP/1.1 429 Too Many RequestsX-RateLimit-Limit: 60X-RateLimit-Remaining: 0Retry-After: 45X-RateLimit-Reset: 1717000000Content-Type: application/json{ "message": "Too Many Requests."}
// Aktuelle Anzahl an Versuchen$hits = RateLimiter::attempts($key);// Sekunden bis zum nächsten Reset$seconds = RateLimiter::availableIn($key);// Ist das Limit erreicht?$tooMany = RateLimiter::tooManyAttempts($key, $maxAttempts = 5);// Zähler manuell zurücksetzen (z. B. nach Logout)RateLimiter::clear($key);
Wenn nur bestimmte Responses gezählt werden sollen, verwenden Sie after(). Ein Beispiel, das nur 404-Responses zählt, um Enumeration-Angriffe zu verhindern:
use Symfony\Component\HttpFoundation\Response;RateLimiter::for('resource-lookup', function (Request $request) { return Limit::perMinute(10) ->by($request->user()?->id ?: $request->ip()) ->after(function (Response $response) { return $response->getStatusCode() === 404; });});
Dadurch wird die throttle-Middleware auf die Klasse ThrottleRequestsWithRedis gemappt und nutzt atomare Redis-Operationen für präzises Zählen.
Wenn Sie throttleWithRedis() verwenden, stellen Sie sicher, dass Redis stets verfügbar ist. Fällt die Verbindung zu Redis aus, können unter Umständen alle Anfragen abgewiesen werden.