
CORS и rate limit
Все настройки ниже — из пространства имён minishop3: Системные настройки → API.
CORS
Значение ms3_cors_allowed_origins | Поведение |
|---|---|
| пусто (так пишет установщик) | Только same-origin: CORS-заголовки не ставятся |
* | Access-Control-Allow-Origin: *, credentials выключаются |
| список через запятую | Сервер отражает Origin запроса и добавляет Vary: Origin и Allow-Credentials: true |
Сам CorsMiddleware создаётся в web.php с allow_credentials => true.
Разрешённые методы: GET, POST, PUT, DELETE, OPTIONS. Разрешённые заголовки: Content-Type, Authorization, X-Requested-With, MS3TOKEN. Значение max_age — 86400.
В шаблоне вида https://*.example.com звёздочка заменяет одну DNS-метку, а не произвольную часть адреса.
На preflight-запрос OPTIONS сервер отвечает 200 и токен не создаёт.
Rate limit
При превышении квоты сервер отвечает 429:
HTTP/1.1 429 Too Many Requests
Retry-After: 42{
"success": false,
"message": "ms3_err_rate_limit",
"code": 429,
"errors": null,
"error_code": "rate_limited"
}Окно фиксированное: отсчёт начинается с первого запроса, reset_at ставится один раз как «сейчас плюс ms3_rate_limit_decay_seconds» и дальше не сдвигается. Когда окно истекло, счётчик обнуляется целиком.
| Заголовок | Когда приходит | Что внутри |
|---|---|---|
Retry-After | только с 429 | секунды до конца окна |
X-RateLimit-Limit | пока запрос укладывается в квоту | значение ms3_rate_limit_max_attempts |
X-RateLimit-Remaining | там же | сколько запросов осталось |
X-RateLimit-Reset | там же | отметка времени Unix конца окна, не секунды |
За обратным прокси счётчик общий
Ключ счётчика — md5() от REMOTE_ADDR. Заголовки вроде X-Forwarded-For middleware намеренно не читает: клиент управляет ими сам, и лимит обходился бы подстановкой. Если сайт стоит за обратным прокси, CDN или сервером Nuxt и веб-сервер не подменяет REMOTE_ADDR настоящим адресом посетителя, все покупатели попадут в один счётчик и упрутся в общий лимит. Настройте передачу реального адреса на уровне веб-сервера.
Запросы OPTIONS в квоту не попадают.
| Настройка | По умолчанию | Что задаёт |
|---|---|---|
ms3_rate_limit_max_attempts | 60 | Число запросов в окне |
ms3_rate_limit_decay_seconds | 60 | Длину окна в секундах |
Хранилище счётчиков задаёт ms3_rate_limit_store (по умолчанию file). Рядом установщик создаёт ключи для redis, memcached и путь к файлу. Формат ответа с ошибкой — Ошибки.
Переменная окружения перекрывает настройку, а сбой бэкенда — молчит
Если задана переменная окружения MS3_RATE_LIMIT_STORE, берётся её значение, а системная настройка игнорируется.
Когда выбранный бэкенд недоступен — нет расширения redis или memcached, не удалось подключиться — фабрика пишет WARN в журнал и тихо переходит на файловое хранилище. Запросы не падают, но на кластере счётчик перестаёт быть общим: каждый узел начинает считать свои попытки. Проверяйте журнал после смены хранилища.
Nuxt на другом origin
- Перечислите в
ms3_cors_allowed_originsorigin фронтенда (или BFF). - Отправляйте запросы с
credentials: 'include'либо используйте Bearer без cookie. - Не ставьте
*вместе с cookie-сессией: с таким значением cookie с другого origin не заработают.
