← Назад к вопросам
Как перейти с сайта project.com на API api.project.com?
1.7 Middle🔥 191 комментариев
#JavaScript Core
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI3 апр. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Задача и контекст
Речь идет о переходе с веб-приложения на отдельное API домена. Это происходит, когда нужно разделить фронтенд и бэкенд на разные домены или микросервисы.
Проблемы при переходе
- CORS (Cross-Origin Resource Sharing) - браузер блокирует запросы между доменами
- Cookies и авторизация - проблемы с передачей credentials
- Потеря состояния - локальное хранилище может быть недоступно
- URL и редиректы - изменение базовых путей API
Решение 1: Настройка CORS на бэкенде
// Если бэкенд на FastAPI
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
app = FastAPI()
app.add_middleware(
CORSMiddleware,
allow_origins=["https://project.com"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
Решение 2: Фронтенд-сторона - обновление API базового URL
// lib/api.ts
const API_BASE_URL = process.env.REACT_APP_API_URL || 'https://api.project.com';
export const apiClient = {
async get(endpoint: string) {
const response = await fetch(`${API_BASE_URL}${endpoint}`, {
method: 'GET',
credentials: 'include',
headers: {
'Content-Type': 'application/json',
}
});
return response.json();
},
async post(endpoint: string, data: any) {
const response = await fetch(`${API_BASE_URL}${endpoint}`, {
method: 'POST',
credentials: 'include',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(data)
});
return response.json();
}
};
Решение 3: Использование axios с конфигурацией
// lib/axiosInstance.ts
import axios from 'axios';
const axiosInstance = axios.create({
baseURL: process.env.REACT_APP_API_URL || 'https://api.project.com',
withCredentials: true,
});
axiosInstance.interceptors.request.use(
(config) => {
const token = localStorage.getItem('authToken');
if (token) {
config.headers.Authorization = `Bearer ${token}`;
}
return config;
},
(error) => Promise.reject(error)
);
axiosInstance.interceptors.response.use(
(response) => response,
(error) => {
if (error.response?.status === 401) {
window.location.href = 'https://project.com/login';
}
return Promise.reject(error);
}
);
export default axiosInstance;
Решение 4: Environment Variables для разных окружений
# .env.development
REACT_APP_API_URL=http://localhost:8000
# .env.production
REACT_APP_API_URL=https://api.project.com
Важные моменты
- Same-Site Cookies: убедись, что cookies отправляются с правильным SameSite флагом
- Preflight requests: OPTIONS запросы должны быть разрешены
- Redirect URL: используй абсолютные URL для редиректов
Миграция без downtime
- Развернуть оба домена одновременно
- Постепенно переводить клиентов на новый API (feature flags)
- Мониторить ошибки обоих сервисов
- После полной миграции отключить старый API