Перейти к содержимому
EVI Solutions

Ошибка CORS в браузере: причины и решения для разработчиков

Средне 20 мин Обновлено:

Краткий ответ

Ошибка CORS возникает, когда браузер блокирует запрос к другому домену, потому что сервер не отправил соответствующий заголовок `Access-Control-Allow-Origin`. Решение на стороне сервера: добавьте разрешённый origin, методы и заголовки, или используйте прокси при разработке. Не пытайтесь обойти её на фронтенде.

Как проявляется проблема

  • В консоли браузера написано: "Access to fetch at ... has been blocked by CORS policy"
  • API-запрос работает в Postman или curl, но не в браузере
  • Сетевой запрос имеет статус 0 или (failed) на вкладке Network
  • Появляется только на локальном сервере разработки, не в продакшене
  • Ошибка возникает после добавления нового домена или поддомена

Частые причины

Отсутствует Access-Control-Allow-Origin

Сервер не отправляет заголовок `Access-Control-Allow-Origin` или отправляет значение, не совпадающее с origin страницы. Браузер тогда блокирует чтение ответа.

Неправильный origin или wildcard с учётными данными

Если вы используете `credentials: 'include'`, сервер не должен возвращать `*`, а только точный origin. Также `http://localhost:3000` и `http://127.0.0.1:3000` являются разными origin.

Preflight-запрос не обработан

Для нестандартных методов или заголовков браузер сначала отправляет OPTIONS-запрос. Если сервер не отвечает на OPTIONS с соответствующими заголовками, основной запрос не отправляется.

Прокси или хостинг не передаёт заголовки

Обратный прокси (Nginx, Apache) или serverless-платформа могут удалить CORS-заголовки или вернуть свою страницу ошибки. Проверьте конфигурацию прокси.

Неправильный URL API

Если фронтенд вызывает неправильный домен, поддомен или порт, сервер может не разрешать этот origin. Проверьте точный URL в коде и список разрешённых origin на сервере.

Пошаговое решение

  1. 1

    Проверьте точный origin в браузере

    Откройте DevTools (F12) и в консоли введите location.origin. Запишите точное значение, например http://localhost:3000. На вкладке Network найдите неудачный запрос и посмотрите заголовки запроса и ответа. Обратите внимание на Origin в запросе и Access-Control-Allow-Origin в ответе.

  2. 2

    Настройте CORS на сервере

    На бэкенде явно разрешите origin фронтенда. В Node.js/Express: app.use(cors({ origin: 'http://localhost:3000', credentials: true })). В Spring Boot: @CrossOrigin(origins = "http://localhost:3000") или глобальная конфигурация. В ASP.NET Core: builder.Services.AddCors(...) и app.UseCors(...). Всегда указывайте точный origin, а не *, если используете учётные данные.

  3. 3

    Обработайте OPTIONS preflight

    Проверьте, что сервер возвращает 204 или 200 на OPTIONS-запрос с заголовками Access-Control-Allow-Methods и Access-Control-Allow-Headers. В Express это делает middleware cors автоматически. В Nginx добавьте add_header Access-Control-Allow-Origin ... и if ($request_method = OPTIONS) { return 204; }.

  4. 4

    Используйте прокси при локальной разработке

    Если вы не можете изменить сервер, настройте прокси в инструменте разработки. В Vite: server.proxy в vite.config.js. В Create React App: поле proxy в package.json. Затем вызывайте API по относительному пути (/api/...) вместо полного URL.

  5. 5

    Избегайте CORS в продакшене

    Лучшее решение, чтобы фронтенд и API были на одном origin (тот же домен и порт). Если нет, используйте обратный прокси, который перенаправляет /api на бэкенд. Так браузер не отправляет cross-origin запрос.

  6. 6

    Проверьте конфигурацию прокси и хостинга

    Если вы используете Nginx, Apache или облачный хостинг, убедитесь, что они не удаляют CORS-заголовки. В Nginx используйте proxy_pass и add_header на правильном уровне. На serverless-платформах (Vercel, Netlify) настройте CORS в заголовках ответа функций или в соответствующей конфигурации.

  7. 7

    Тестируйте с помощью curl

    Симулируйте preflight: curl -i -X OPTIONS http://localhost:8080/api/podaci -H "Origin: http://localhost:3000" -H "Access-Control-Request-Method: GET". Проверьте, содержит ли ответ Access-Control-Allow-Origin и Access-Control-Allow-Methods. Если не содержит, проблема на сервере.

  8. 8

    Очистите кеш и перезагрузите

    Браузеры могут кешировать preflight-ответы согласно заголовку Access-Control-Max-Age. Дождитесь истечения срока, перезапустите браузер или временно уменьшите это значение на сервере. В DevTools включите "Disable cache" и обновите страницу. Иногда нужно перезапустить сервер разработки, чтобы применились изменения конфигурации.

Если ничего не помогает: продвинутые проверки

Проверьте, возвращает ли сервер CORS-заголовки только для успешных ответов. Если приложение выдаёт ошибку 500, CORS-заголовки могут отсутствовать, и браузер сообщит о CORS вместо реальной ошибки. В этом случае сначала исправьте серверную ошибку. Затем используйте инструмент, такой как curl или Postman, чтобы увидеть сырой ответ. Обратите внимание на редиректы: если сервер перенаправляет http на https, CORS-заголовки могут потеряться. Наконец, проверьте, есть ли у вас несколько слоёв (CDN, балансировщик нагрузки, прокси) и не удаляет ли какой-то из них заголовки. В продакшене никогда не используйте Access-Control-Allow-Origin: *, если приложение использует куки или заголовки авторизации.

Как избежать повторения

  • Определите список разрешённых origin в конфигурации сервера и обновляйте его при каждом изменении домена.
  • Используйте один origin для фронтенда и API везде, где возможно, или обратный прокси.
  • Тестируйте поведение CORS автоматическими тестами или curl перед публикацией.
  • Избегайте `*` для `Access-Control-Allow-Origin`, когда используете учётные данные.

Когда лучше обратиться к специалисту

Если вы испробовали все шаги, а ошибка CORS всё ещё блокирует приложение, или если у вас нет доступа к конфигурации сервера, обратитесь в IT-поддержку или к команде DevOps. Они могут проверить прокси, хостинг и правила безопасности.

Разработка ПО и продуктов · Приложения на заказ, SaaS и MVP за 4-8 недель

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

Почему ошибка CORS не возникает в Postman?

Postman и curl не применяют правила CORS, так как не являются браузерами. CORS, это мера безопасности браузера, поэтому ошибка появляется только в браузере. Это подтверждает, что проблема в заголовках сервера, а не в сети.

Можно ли исправить CORS на фронтенде?

Вы не можете окончательно исправить CORS на фронтенде, потому что браузер блокирует чтение ответа или сам запрос при preflight, прежде чем данные дойдут до вашего JavaScript-кода. Единственное решение, чтобы сервер отправлял правильные заголовки или использовать прокси.

Что означает ошибка "Credential is not supported if the CORS header is wildcard"?

Это означает, что вы отправляете учётные данные (например, куки), а сервер возвращает `Access-Control-Allow-Origin: *`. Браузер этого не разрешает. Сервер должен вернуть точный origin и `Access-Control-Allow-Credentials: true`.

Поделиться
Не нашли решение?ИИ-помощник работает 24/7. Опишите проблему или отправьте скриншот ошибки и получите инструкцию для вашего случая.Спросить ИИ-помощника