FastAPI CORSMiddleware: безопасный CORS для SPA (список и regex)
Готовая настройка CORS для FastAPI: явный список доменов и шаблон поддоменов, поддержка credentials, нужные заголовки и методы. Прод и dev из .env.
# app/main.py
import os
from fastapi import FastAPI
from starlette.middleware.cors import CORSMiddleware
app = FastAPI()
# Вариант 1: явный список доменов из .env
# CORS_ORIGINS="https://app.example.com,https://admin.example.com,http://localhost:5173"
origins = [o.strip() for o in os.getenv("CORS_ORIGINS", "").split(",") if o.strip()]
# Вариант 2: разрешить все поддомены example.com
origin_regex = os.getenv("CORS_REGEX", r"https://([a-z0-9-]+\.)*example\.com")
app.add_middleware(
CORSMiddleware,
allow_origins=origins if origins else [], # если пусто — используем regex ниже
allow_origin_regex=origin_regex if not origins else None,
allow_credentials=True,
allow_methods=["GET","POST","PUT","PATCH","DELETE","OPTIONS"],
allow_headers=["Authorization","Content-Type","X-Requested-With"],
expose_headers=["Content-Disposition"], # чтобы скачивания работали корректно
max_age=86400, # кеш preflight в браузере
)