Что такое CORS и почему он блокирует Angular-приложения
Cross-Origin Resource Sharing (CORS) — механизм безопасности браузеров, предотвращающий межсайтовые запросы. Когда Angular-приложение, запущенное на localhost:4200, обращается к API на другом домене (например, api.example.com), браузер блокирует запрос из-за политики одинакового источника. Это вызывает ошибки вида:
- «Access to XMLHttpRequest has been blocked by CORS policy»
- «No ‘Access-Control-Allow-Origin’ header is present»
Как прокси-сервер решает проблемы CORS в Angular
Прокси-сервер выступает посредником: Angular отправляет запросы не напрямую к API, а к локальному серверу разработки, который перенаправляет их на целевой домен. Поскольку запрос идет с одного origin (localhost), CORS-ограничения не применяются. Преимущества подхода:
- Не требует изменений бэкенда
- Работает в dev-режиме без деплоя
- Позволяет тестировать API с локальной машины
Пошаговая настройка прокси в Angular CLI
Создайте файл proxy.conf.json
в корне проекта:
{ "/api/*": { "target": "https://ваш-api-домен.com", "secure": false, "changeOrigin": true, "logLevel": "debug", "pathRewrite": {"^/api": ""} } }
Обновите angular.json
:
"serve": { "options": { "proxyConfig": "proxy.conf.json" } }
Запустите приложение командой ng serve
. Все запросы к /api
будут перенаправлены через прокси.
Альтернативные методы обработки CORS
- Настройка сервера: Добавление заголовков
Access-Control-Allow-Origin
на бэкенде. - Chrome с отключенным CORS: Запуск браузера с флагом
--disable-web-security
(только для тестов). - CORS Anywhere: Публичные прокси-сервисы для разработки.
Часто задаваемые вопросы (FAQ)
Q: Будет ли прокси работать в продакшене?
A: Нет, это решение только для разработки. Для продакшена настройте CORS на сервере или используйте облачный прокси.
Q: Как обрабатывать несколько API-эндпоинтов?
A: Добавьте несколько контекстных путей в proxy.conf.json
:
{ "/api1/*": { "target": "https://api1.com" }, "/api2/*": { "target": "https://api2.net" } }
Q: Почему после настройки прокси запросы всё равно блокируются?
A: Проверьте:
- Корректность пути в proxy.conf.json
- Перезапуск
ng serve
- Отсутствие опечаток в URL запросов
Q: Можно ли использовать прокси с Angular Universal?
A: Да, но требуется кастомная настройка серверного прокси через Express.js или аналоги.