Аптечка вайб-кода

CORS-ошибка в проекте, написанном с ИИ

CORS-ошибка значит, что браузер не получил от сервера разрешения на запрос с вашего домена. Чинится это на сервере, который принимает запрос: он должен ответить на предварительный OPTIONS и прислать заголовок Access-Control-Allow-Origin с вашим доменом. Если запрос идёт к чужому API вроде OpenAI, его нужно проксировать через свой сервер.

Цена: от 80 000 ₸Срок: диагностика за 1 день, исправление от 1 дня
Спросить в WhatsApp
NUMETEKAIVA GROUPSAFIAHECTONEWTONEAsar SuJAILYSalt DasturMatras FactoryEcolosKvadrumNUMETEKAIVA GROUPSAFIAHECTONEWTONEAsar SuJAILYSalt DasturMatras FactoryEcolosKvadrum

Первая помощь и как чиним

  1. 1
    Прочитать ошибку целиком

    Определяем, к какому адресу запрос, есть ли preflight OPTIONS и какого заголовка не хватает.

  2. 2
    Найти, кто отвечает

    Ваш бэкенд, edge-функция, nginx или чужой API — от этого зависит способ починки.

  3. 3
    Настроить разрешения

    Явный список доменов, ответ на OPTIONS, нужные методы и заголовки.

  4. 4
    Проксировать чужие API

    Переносим вызов на свой сервер, заодно убирая ключ из браузера.

  5. 5
    Проверить все окружения

    Локально, превью и прод: у каждого свой origin, включая www и без него.

Честно

Чинить самому или отдать в «аптечку»

СамостоятельноС Emaya
ДиагностикаСпрашиваете ИИ — он чинит одно и ломает другоеНаходим корень проблемы за 1 день
БезопасностьНе знаете, утекли ли ключи и данныеАудит, ротация ключей, закрытые доступы
ДеплойЛокально работает, на хостинге — белый экранСервер, домен, HTTPS, мониторинг
КодНикто, кроме ИИ, не понимает, как это устроеноПорядок в коде и документация
БудущееКаждая новая функция — лотереяПроект можно спокойно развивать
ВремяНочи в консолиВы занимаетесь бизнесом, мы — кодом
Где спотыкаются чаще всего

Мы уже наступили на эти грабли — вам не придётся

⚠ Утечка ключей в git⚠ RLS в Supabase⚠ Белый экран после сборки⚠ Зависимости и версии⚠ Нет логов и мониторинга⚠ Хаос в структуре кода

Аптечка: что с проектом?

3 вопроса — и мы скажем, сколько стоит починка. Чек-лист безопасности проекта в подарок.

Как работаем
01Разбор

Интервью с собственником и РОПом, аудит текущей CRM и источников заявок.

1–3 дня
02Карта процессов

Воронки, роли, точки контроля. Согласуем до того, как что-то настраивать.

3–5 дней
03Сборка

Настраиваем Битрикс24 и дописываем недостающие инструменты. Демо каждую неделю.

1–4 недели
04Запуск и рост

Обучение, база знаний, поддержка. Дорабатываем, пока цифры не поедут вверх.

дальше — с вами
Подробнееразвёрнутое описание, этапы и нюансы

Сообщение 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.

Что проверить самому

  1. Откройте DevTools → Network, найдите красный запрос и посмотрите, был ли перед ним OPTIONS и какой у него статус.
  2. Проверьте, совпадает ли origin в ошибке с тем, что разрешено на сервере, включая www и https.
  3. Посмотрите логи бэкенда: возможно, это не CORS, а падение сервера.
  4. Проверьте, нет ли запросов с https-страницы на http-адрес — это mixed content, а не CORS.
  5. Если запрос идёт к чужому 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 минуты.

WhatsApp
Другие проблемы, которые чиним
Аудит безопасности проекта на вайб-коде →Как настроить git и не терять рабочие версии проекта →Белый экран и ошибки в консоли →ИИ ломает код при каждой правке →Как добавить оплату в проект, сделанный с ИИ →Как настроить бэкапы базы данных →Как передать проект на вайб-коде программисту →Как подключить домен и HTTPS к своему проекту →Как задеплоить проект из Cursor на свой сервер →Проект на Next.js не собирается →Проект из Lovable не работает после экспорта →Перенос проекта с Bolt или Replit на свой сервер →Перенос проекта с Firebase или Supabase на свой сервер →Приложение тормозит после роста пользователей →Рефакторинг после вайб-кода: как сделать код поддерживаемым →Сайт работает локально, но не на хостинге →Ошибки Supabase RLS: база пустая или запись не проходит →Утёк API-ключ OpenAI или Supabase: что делать →Нет авторизации: любой видит чужие данные →
Напишите нам
Заявка

Обсудим задачу?

Ответим в течение часа в рабочее время. Или сразу напишите в WhatsApp.

Нажимая «Отправить», вы соглашаетесь на обработку контактных данных для ответа на заявку.

Пройти →