Skip to content
  1. Компоненты
  2. MiniShop3
  3. Разработка
  4. Web API
  5. CORS и rate limit

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
HTTP/1.1 429 Too Many Requests
Retry-After: 42
json
{
  "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_attempts60Число запросов в окне
ms3_rate_limit_decay_seconds60Длину окна в секундах

Хранилище счётчиков задаёт ms3_rate_limit_store (по умолчанию file). Рядом установщик создаёт ключи для redis, memcached и путь к файлу. Формат ответа с ошибкой — Ошибки.

Переменная окружения перекрывает настройку, а сбой бэкенда — молчит

Если задана переменная окружения MS3_RATE_LIMIT_STORE, берётся её значение, а системная настройка игнорируется.

Когда выбранный бэкенд недоступен — нет расширения redis или memcached, не удалось подключиться — фабрика пишет WARN в журнал и тихо переходит на файловое хранилище. Запросы не падают, но на кластере счётчик перестаёт быть общим: каждый узел начинает считать свои попытки. Проверяйте журнал после смены хранилища.

Nuxt на другом origin ​

  1. Перечислите в ms3_cors_allowed_origins origin фронтенда (или BFF).
  2. Отправляйте запросы с credentials: 'include' либо используйте Bearer без cookie.
  3. Не ставьте * вместе с cookie-сессией: с таким значением cookie с другого origin не заработают.