Skip to content

Как настроить CORS правильно

Коротко:

CORS (Cross-Origin Resource Sharing) — механизм, разрешающий JavaScript с одного origin (domain:port:scheme) запрашивать ресурсы с другого. Без CORS browsers блокируют fetch/XHR. Настройка: HTTP-заголовки Access-Control-Allow-Origin, Access-Control-Allow-Methods, Access-Control-Allow-Headers. Для credentials и non-simple requests — preflight (OPTIONS).

Ниже: пошаговая инструкция, рабочие примеры, типичные ошибки, FAQ.

Пошаговая настройка

  1. Определите allowed origins. Wildcard * — только для public API без credentials
  2. Для specific origins: echo Origin header если in whitelist
  3. Для preflight (OPTIONS): ответить Access-Control-Allow-Methods: GET, POST, PUT
  4. Если нужны cookies: Access-Control-Allow-Credentials: true + НЕ wildcard
  5. Cache preflight: Access-Control-Max-Age: 86400 (24h)
  6. Проверьте: Enterno CORS-чекер с test Origin
  7. В DevTools → Network → ищите preflight OPTIONS + headers

Рабочие примеры

СценарийКонфиг
nginx simple CORSadd_header 'Access-Control-Allow-Origin' 'https://app.example.com' always; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS' always; add_header 'Access-Control-Allow-Headers' 'Authorization, Content-Type' always;
nginx preflightif ($request_method = OPTIONS) { add_header 'Access-Control-Allow-Origin' '$http_origin'; add_header 'Access-Control-Max-Age' 86400; return 204; }
Apache .htaccessHeader set Access-Control-Allow-Origin "https://app.example.com" Header set Access-Control-Allow-Credentials "true"
Express.jsapp.use(cors({ origin: 'https://app.example.com', credentials: true }));
Whitelist multiple originsmap $http_origin $cors_origin { default ""; "~^https?://(app|api)\.example\.com$" $http_origin; } add_header 'Access-Control-Allow-Origin' $cors_origin always;

Типичные ошибки

  • Wildcard * + Credentials=true — browsers блокируют, silent fail
  • Не отвечать на preflight OPTIONS — Chrome delegates заголовки на actual request который никогда не произойдёт
  • Access-Control-Allow-Headers не включает custom header типа X-Request-Id — fail
  • Echo Origin без whitelist — CSRF vulnerability для credentialed endpoints
  • Разница между simple request (GET без headers) и non-simple — первый не делает preflight

Больше по теме

Часто задаваемые вопросы

Что такое simple request?

Simple request: GET/HEAD/POST + only standard headers (Accept, Content-Type in form/text). Без preflight OPTIONS, идёт сразу. Не simple = preflight обязателен.

Почему не работает wildcard * с credentials?

Security spec: credentials (cookies) + wildcard = теоретически любой site может украсть sessions. Browsers блокируют комбинацию.

Как отладить CORS ошибку?

DevTools → Network → красный запрос → Headers. Console покажет "CORS policy: ..." с причиной. <a href="/cors">Enterno CORS checker</a> симулирует разные Origin headers.

Проверить CORS online?

<a href="/cors">Enterno CORS checker</a> — введите URL + Origin → увидите what headers returned.