Генератор заголовков CORS

Перечислите сайты, которым можно обращаться к вашему API, методы и заголовки, которые они используют, и отправляются ли cookie. Генератор напишет логику Access-Control-Allow-Origin для одного или нескольких источников, остальные заголовки CORS и ответ 204 на preflight-запросы.

Разрешённые источники
Схема, хост и при необходимости порт, через запятую или пробел: https://app.example.com, http://localhost:3000
Заголовки, которые может отправлять браузер, например Content-Type или Authorization.
Заголовки ответа, которые JavaScript может прочитать сверх базовых, например X-Total-Count. Пусто — если таких нет.
Сколько браузер может повторно использовать ответ на preflight. Пусто — не отправлять.

nginx: блок map — в http {}, остальное — в ваш server или location. Apache: нужны mod_headers, mod_setenvif и mod_rewrite. Node.js: вызовите cors(req, res) первым делом и прекратите обработку, если функция вернула true.

Работает в браузере: всё, что вы вводите, никуда не отправляется.

Как пользоваться

  1. Выберите сервер и режим: только перечисленные источники или любой источник.
  2. Введите источники в точности так, как их отправляет браузер: схема, хост и порт, без пути. Слеш в конце убирается.
  3. Настройте методы, заголовки запроса, открытые заголовки, credentials и время кэша preflight и скопируйте конфигурацию.

Как работает CORS

К межсайтовым запросам браузер добавляет заголовок Origin. В ответе должен быть Access-Control-Allow-Origin с этим источником (или *), иначе JavaScript не сможет его прочитать. Перед сложными запросами идёт preflight-запрос OPTIONS, на который нужно ответить списком разрешённых методов и заголовков.

Заголовок Значение
Access-Control-Allow-Origin единственный источник, которому можно читать ответ, или *
Access-Control-Allow-Methods методы, разрешённые в основном запросе
Access-Control-Allow-Headers заголовки, которые может отправить клиент
Access-Control-Expose-Headers заголовки ответа, доступные JavaScript
Access-Control-Allow-Credentials true — разрешить cookie и HTTP-авторизацию
Access-Control-Max-Age сколько секунд можно кэшировать ответ на preflight

Пример

Источники https://example.com и https://app.example.com для nginx. Их два, поэтому генератор пишет map, который копирует Origin запроса в $cors_origin, только если он есть в списке:

map $http_origin $cors_origin {
    default "";
    "https://example.com" $http_origin;
    "https://app.example.com" $http_origin;
}

Внутри location / отправляются Access-Control-Allow-Origin $cors_origin, Vary: Origin, методы, заголовки и Access-Control-Max-Age 86400, а на OPTIONS выполняется return 204.

Частые ошибки

  • Путь или слеш в источнике. Браузер отправляет https://example.com, а не https://example.com/ и не https://example.com/api.
  • Нет Vary: Origin, хотя разрешённый источник меняется от запроса к запросу: CDN может отдать ответ одного сайта другому.
  • Заголовки CORS в двух местах (в приложении и в прокси). Два заголовка Access-Control-Allow-Origin браузер отвергает.

Частые вопросы

Как разрешить несколько источников?

В Access-Control-Allow-Origin может быть только один источник или *. Сервер должен сравнить заголовок Origin запроса со своим списком и при совпадении вернуть этот источник, добавив Vary: Origin, чтобы кэши не смешивали ответы. Сгенерированные map для nginx, правило SetEnvIf для Apache и проверка в Node.js делают именно это.

Почему нельзя * вместе с credentials?

Это запрещает стандарт Fetch: если запрос несёт cookie или HTTP-авторизацию, браузер принимает только ответ с точным источником. С * и credentials браузер заблокирует ответ.

Что такое preflight-запрос?

Для запросов сложнее простых GET, HEAD или POST из формы — например, с телом JSON или заголовком Authorization — браузер сначала отправляет OPTIONS и спрашивает, какие методы и заголовки разрешены. Сервер отвечает заголовками CORS и пустым ответом 204, а Max-Age позволяет браузеру закэшировать этот ответ.

CORS защищает мой API?

Нет. CORS только сообщает браузерам, каким чужим сайтам можно читать ваши ответы. Серверные скрипты и curl его не учитывают. Аутентификацию и права доступа всё равно нужно проверять в каждом запросе.

Нужно ли указывать Content-Type в разрешённых заголовках?

Да, если клиенты отправляют JSON. Content-Type свободен только со значениями text/plain, multipart/form-data и application/x-www-form-urlencoded; application/json вызывает preflight, который должен его разрешить.

Ещё в разделе «Разработчикам»

Все инструменты раздела: Разработчикам ·Обновлено 7 ноября 2026 г.

Настройки конфиденциальности

Google Analytics показывает нам, какими инструментами пользуются и работают ли они. Он может ставить cookie. Ваш выбор сохраняется в этом браузере.