CORS (Cross-Origin Resource Sharing) — это механизм безопасности браузеров, который запрещает веб-странице, загруженной с одного домена (например, `мойсайт.ru`), делать запросы к другому домену (например, `api-базы.ru`), если этот другой домен явно не разрешил это.
Простыми словами: браузер не дает вашему Vue-приложению общаться с вашим же бэкендом, если они живут на разных адресах/портах, пока вы не настроите CORS.
Почему это проблема для Vue + бэкенда?
Во время разработки:
- Vue работает на `http://localhost:8080` (если через `npm run serve`)
- Ваш бэкенд (Node.js/PHP) работает на `http://localhost:3000`
Это разные порты → браузер считает их разными сайтами → блокирует запросы.
Опубликованный сайт:
- Vue на `https://мойсайт.ru`
- Бэкенд на `https://api.мойсайт.ru` (поддомен)
Тоже разные источники → нужен CORS.
Как это выглядит на практике. Без CORS (ошибка в консоли браузера):
Access to fetch at 'http://localhost:3000/api/users' from origin 'http://localhost:8080'
has been blocked by CORS policy
Решение: настройка CORS на бэкенде. Вы говорите бэкенду: «Разреши моему Vue-приложению обращаться к тебе».
Пример на Node.js (Express):
Вариант 1 — разрешить всё (только для разработки!):
const express = require('express');
const cors = require('cors');
const app = express();
app.use(cors()); // разрешить запросы с любых доменов
app.get('/api/users', (req, res) => {
res.json([{ id: 1, name: 'John' }]);
});
Вариант 2 — разрешить только ваш Vue-домен (для опубликованного рабочего сервера):
const cors = require('cors');
app.use(cors({
origin: 'https://мойсайт.ru', // только этот домен может стучаться
methods: ['GET', 'POST'], // разрешённые HTTP-методы
credentials: true // если используете куки/авторизацию
}));
Вариант 3 — несколько разрешённых доменов:
const corsOptions = {
origin: ['https://мойсайт.ru', 'http://localhost:8080'],
optionsSuccessStatus: 200
};
app.use(cors(corsOptions));
Пример на PHP:
header("Access-Control-Allow-Origin: https://мойсайт.ru");
header("Access-Control-Allow-Methods: GET, POST");
Пример на Nginx (если бэкенд на PHP/FastAPI):
add_header 'Access-Control-Allow-Origin' 'https://мойсайт.ru';
add_header 'Access-Control-Allow-Methods' 'GET, POST';
Распространённые ошибки с CORS:
1. Забыли настроить на бэкенде → браузер заблокирует запросы.
2. Указали `*` (звёздочку) вместе с `credentials: true` → браузер тоже заблокирует (так нельзя).
3. Не настроили предварительный запрос OPTIONS — браузер сначала шлёт OPTIONS-запрос (проверить разрешения), ваш бэкенд должен на него корректно ответить.
Как тестировать без CORS (только разработка):
Способ 1: прокси в Vue CLI
В файле vue.config.js:
module.exports = {
devServer: {
proxy: 'http://localhost:3000' // все API-запросы уходят на бэкенд
}
}
Тогда во Vue пишете `fetch('/api/users')` вместо `fetch('http://localhost:3000/api/users')` — прокси сам перенаправит, и CORS не нужен.
Способ 2: расширение браузера (например, "CORS Unblock" — только для локального теста, опасно для постоянного использования).
Важно запомнить:
- CORS — это защита со стороны браузера, не сервера.
- Злоумышленник может обойти CORS (через curl, Postman, свой сервер), поэтому CORS не заменяет полноценную аутентификацию и авторизацию на бэкенде.
Для вашей задачи (Vue + бэкенд с MySQL): обязательно настройте CORS на бэкенде, иначе фронтенд не сможет получать данные из базы. На рабочем опубликованном сайте разрешайте только реальный домен вашего Vue-приложения.