CORS-ошибка в проекте, написанном с ИИ
CORS-ошибка значит, что браузер не получил от сервера разрешения на запрос с вашего домена. Чинится это на сервере, который принимает запрос: он должен ответить на предварительный OPTIONS и прислать заголовок Access-Control-Allow-Origin с вашим доменом. Если запрос идёт к чужому API вроде OpenAI, его нужно проксировать через свой сервер.
Первая помощь и как чиним
- 1Прочитать ошибку целиком
Определяем, к какому адресу запрос, есть ли preflight OPTIONS и какого заголовка не хватает.
- 2Найти, кто отвечает
Ваш бэкенд, edge-функция, nginx или чужой API — от этого зависит способ починки.
- 3Настроить разрешения
Явный список доменов, ответ на OPTIONS, нужные методы и заголовки.
- 4Проксировать чужие API
Переносим вызов на свой сервер, заодно убирая ключ из браузера.
- 5Проверить все окружения
Локально, превью и прод: у каждого свой origin, включая www и без него.
Чинить самому или отдать в «аптечку»
Мы уже наступили на эти грабли — вам не придётся
Аптечка: что с проектом?
3 вопроса — и мы скажем, сколько стоит починка. Чек-лист безопасности проекта в подарок.
Интервью с собственником и РОПом, аудит текущей CRM и источников заявок.
1–3 дняВоронки, роли, точки контроля. Согласуем до того, как что-то настраивать.
3–5 днейНастраиваем Битрикс24 и дописываем недостающие инструменты. Демо каждую неделю.
1–4 неделиОбучение, база знаний, поддержка. Дорабатываем, пока цифры не поедут вверх.
дальше — с вамиПодробнееразвёрнутое описание, этапы и нюансы
Сообщение Access to fetch at '...' from origin '...' has been blocked by CORS policy — одна из самых частых жалоб после того, как проект с ИИ выкладывают на хостинг. ИИ обычно предлагает поставить расширение для браузера, добавить mode: 'no-cors' во фронтенд или разрешить всё звёздочкой. Первое работает только у вас, второе делает ответ нечитаемым, третье иногда открывает дыру.
Почему так происходит
Браузер разрешает странице на site.kz читать ответы с api.site.kz или чужого домена, только если сервер явно это разрешил заголовком Access-Control-Allow-Origin. Для запросов с JSON, токенами или методами кроме GET и POST браузер сначала шлёт «разведочный» запрос OPTIONS (preflight), и сервер должен ответить на него правильно.
Типичные причины в вайб-код проектах:
- В dev-режиме Vite или Next.js проксировал запросы, на проде прокси нет.
- Edge-функция Supabase не обрабатывает
OPTIONSи не возвращает CORS-заголовки, особенно в ответах с ошибкой. - Разрешён
https://site.kz, а пользователь пришёл наhttps://www.site.kz. - Фронтенд напрямую вызывает OpenAI или другой API, который не рассчитан на вызовы из браузера.
- Сервер упал с ошибкой 500 без заголовков, и браузер показывает это как CORS.
Что проверить самому
- Откройте DevTools → Network, найдите красный запрос и посмотрите, был ли перед ним
OPTIONSи какой у него статус. - Проверьте, совпадает ли origin в ошибке с тем, что разрешено на сервере, включая
wwwиhttps. - Посмотрите логи бэкенда: возможно, это не CORS, а падение сервера.
- Проверьте, нет ли запросов с
https-страницы наhttp-адрес — это mixed content, а не CORS. - Если запрос идёт к чужому API с ключом — его нужно перенести на сервер в любом случае.
Пример настройки в Express:
import cors from 'cors';
app.use(cors({ origin: ['https://site.kz', 'https://www.site.kz'], credentials: true }));
Когда звать разработчика. Если вы видите, что ошибка возникает на вашем собственном API и вы можете поменять его код, настройка CORS займёт пару строк. Сложнее, когда запросы идут к edge-функциям, чужим сервисам или через несколько доменов, когда вход работает через куки или когда ошибка «плавает» и появляется только иногда. Тогда CORS часто маскирует другую проблему: падение сервера, неправильный адрес API или вызов платного сервиса из браузера. Не стоит ставить звёздочку «чтобы заработало» — лучше разобраться один раз.
Как чиним мы
Находим, какой именно сервер отвечает без разрешения, и настраиваем CORS там: явный список доменов для каждого окружения, корректный ответ на preflight, заголовки и в успешных ответах, и в ошибках. Если фронтенд обращается к внешним API напрямую, делаем серверный прокси, убираем ключи из браузера и добавляем ограничение частоты запросов. Часто удобнее разместить фронтенд и API на одном домене через nginx — тогда CORS не нужен вовсе. Подробнее — на странице «Аптечка вайб-кода».
Сколько стоит
Минимальная стоимость «Аптечки» — от 80 000 ₸: диагностика за 50 000 ₸ плюс исправление. Если причина в архитектуре и нужно выносить вызовы API на сервер, это считается как исправление ошибок или доработка. Точнее — в калькуляторе. Чтобы такие проблемы не всплывали после каждой выкладки, держите одинаковое окружение локально и на сервере — подробности в статье «Почему вайб-код ломается».
Частые вопросы
Почему через Postman всё работает, а в браузере нет?
CORS — защита браузера. Postman и серверные запросы его не проверяют, поэтому там ошибки нет.
Можно поставить Access-Control-Allow-Origin: * и забыть?
Для публичного API без авторизации — допустимо. Для запросов с куками или токенами браузер «*» не примет, а открывать API всем сайтам небезопасно.
Ошибка появилась только после выкладки. Почему?
Локально фронтенд и API часто на одном адресе или работают через прокси dev-сервера. На проде домены разные, и сервер должен явно разрешить ваш домен.
Сделаем так же у вас
Короткий созвон — и вы знаете срок и цену. Или посчитайте сами за 2 минуты.