CORS ошибки в веб приложении исправляются добавлением правильных заголовков Access-Control-Allow-Origin на сервер или настройкой прокси. Это позволяет браузеру разрешить запросы с других доменов.
Причины возникновения CORS ошибки
- Браузер блокирует запросы с одного домена на другой в целях безопасности (Same-Origin Policy)
- Сервер не отправляет требуемые заголовки
Access-Control-*в ответе - Неправильно настроена конфигурация CORS на бэкенде
- Фронтенд и бэкенд работают на разных портах или доменах
- Отсутствует обработка preflight запросов (
OPTIONS)
Пошаговая инструкция
Способ 1: Настройка CORS на Node.js/Express
- Откройте файл вашего серверного приложения (обычно
server.jsилиapp.js) - Установите пакет
corsкомандой:npm install cors - Добавьте в начало кода строку:
const cors = require('cors'); - Добавьте middleware до остальных маршрутов:
app.use(cors()); - Для конкретного домена используйте:
app.use(cors({ origin: 'https://yourdomain.com' })); - Сохраните файл и перезагрузите сервер
- Проверьте в DevTools браузера (вкладка
Network), что заголовокAccess-Control-Allow-Originприсутствует в ответе
Способ 2: Ручная настройка заголовков на Node.js
- Откройте файл серверного приложения
- Добавьте обработчик для всех запросов перед остальными маршрутами:
app.use((req, res, next) => {
res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization');
next();
});
- Добавьте обработку
OPTIONSзапросов:app.options('*', cors()); - Перезагрузите сервер
- Проверьте в консоли браузера, что ошибка CORS исчезла
Способ 3: Настройка CORS на PHP
- Откройте файл, который обрабатывает запросы (обычно
api.phpилиindex.php) - Добавьте в начало файла строки:
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type, Authorization');
- Для обработки preflight запросов добавьте:
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
http_response_code(200);
exit();
} - Сохраните файл
- Обновите страницу в браузере и проверьте отсутствие CORS ошибки
Способ 4: Использование прокси (для фронтенда)
- Откройте файл
package.jsonв корне проекта React/Vue - Добавьте строку:
"proxy": "http://localhost:5000"(замените адрес на ваш сервер) - В компоненте замените полный URL на относительный путь: вместо
http://localhost:5000/apiиспользуйте/api - Перезагрузите приложение командой
npm start - Проверьте, что запросы теперь идут через прокси
Способ 5: Настройка CORS в nginx
- Откройте конфиг файл nginx:
/etc/nginx/sites-available/default(в Linux) - Найдите блок
serverи добавьте в него:
add_header 'Access-Control-Allow-Origin' '*' always;
add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS' always;
add_header 'Access-Control-Allow-Headers' 'Content-Type, Authorization' always;
- Для обработки preflight запросов добавьте:
if ($request_method = 'OPTIONS') {
return 204;
}
- Сохраните файл и перезагрузите nginx:
sudo systemctl restart nginx - Проверьте в браузере, что ошибка CORS исчезла
Часто задаваемые вопросы
Почему использование Access-Control-Allow-Origin: * опасно? Звездочка разрешает доступ с любого домена, что может привести к утечкам данных; используйте конкретные домены в production.
Что такое preflight запрос? Это автоматический запрос OPTIONS, который браузер отправляет перед сложными запросами (POST, PUT, DELETE) для проверки разрешений.
Как проверить, что CORS работает правильно? Откройте DevTools браузера, перейдите в вкладку Network, выполните запрос и убедитесь, что ответ содержит заголовок Access-Control-Allow-Origin.