Core/RateLimiter.php, ukládá se do tabulky sys_rate_limits.
Default limit
30 požadavků za 60 sekund per IP per endpoint. Pokud limit překročíte, dostanete429 Too Many Requests.
Per-endpoint override
Vconfig/api.json lze konkrétní endpointy nastavit jinak — typicky přísněji u citlivých akcí:
<requestů>/<sekund>.
Klíč
Klíč v tabulcesys_rate_limits má strukturu {ip}:{endpoint}. Tedy:
- IP adresa žadatele
- Cesta endpointu (např.
auth/login)
X-Forwarded-For (po validaci).
Čistění
CronLogRetentionJob se mimochodem stará i o vyprázdnění starých rate-limit záznamů. Nicméně samotný limiter funguje jen na základě window_start, takže staré záznamy se po vypršení okna automaticky neaplikují.
Reakce na 429
Klient by měl:- Načíst
Retry-Afterhlavičku, pokud je přítomná. - Počkat odpovídající dobu.
- Opakovat — případně s exponenciálním backoffem.
Bypass
V developer_mode lze rate limit globálně vypnout (řešeno v controlleruRateLimiter::skipIfDeveloper()). V produkci je vždy zapnutý.
Sledování
Logy429 se zapisují do logs/app.log s úrovní WARNING. Pokud sledujete podezřelé chování, projděte si tyto záznamy.