FastAPI未配置CORSMiddleware是跨域报错主因:uvicorn仅转发请求,FastAPI默认拒绝所有跨域请求;需在main.py中正确导入并注册中间件,且allow_origins不能为["*"]同时设allow_credentials=True,Nginx还需透传Origin头并禁用自行响应OPTIONS。

Uvicorn 本身不处理跨域,报错实际来自 FastAPI 应用层未配置 CORS 中间件——直接跑 uvicorn main:app 而没加 CORSMiddleware,浏览器预检请求(OPTIONS)就会被拒绝,返回 400 或 405 错误。
FastAPI 没配 CORSMiddleware 就启动 uvicorn
这是最常见原因:Uvicorn 只是 ASGI 服务器,它把请求原样转给 FastAPI;而 FastAPI 默认不放行任何跨域请求。即使你写了 @app.get("/api"),只要前端域名和后端不一致(比如前端是 http://localhost:3000,后端是 http://localhost:8000),浏览器就会拦截。
- 检查
main.py是否导入并注册了CORSMiddleware,漏掉这一步等于没配 -
allow_origins不能写成["*"]同时又设allow_credentials=True,否则浏览器直接拒绝,报错信息通常是Access to fetch at '...' from origin '...' has been blocked by CORS policy: The value of the 'Access-Control-Allow-Origin' header in the response must not be the wildcard '*' when the request's credentials mode is 'include' - 开发阶段可临时用
allow_origins=["http://localhost:3000", "http://127.0.0.1:3000"],但别留["*"]进 Git
预检请求(OPTIONS)返回 405 Method Not Allowed
说明 FastAPI 路由没响应 OPTIONS 方法,常见于自定义中间件或重写了路由逻辑,干扰了 CORSMiddleware 的默认行为。
Uvicorn 0.52.1 是 Python ASGI Web 服务器,提供异步应用服务及 WebSocket 支持,常用于 FastAPI、Starlette 等应用的开发和部署。本下载为官方 PyPI 通用 wheel 包,可使用 pip 安装,并由包管理器处理所需依赖。
-
CORSMiddleware必须在所有业务路由注册前添加,顺序错了中间件不生效 - 确认没手动在某个
@app.api_route或APIRouter上禁用了 OPTIONS,比如写了methods=["GET", "POST"]却漏掉OPTIONS - 如果用了
router = APIRouter(...),确保它挂载到app时没覆盖中间件执行链
部署到 Nginx 后跨域依旧失败
这时候问题往往不在 FastAPI,而在反向代理层——Nginx 默认不透传 Origin 头,也不处理预检请求,导致 FastAPI 根本收不到 OPTIONS 请求。
- Nginx 配置里必须显式透传关键头:
proxy_set_header Origin $http_origin;和proxy_pass_request_headers on; - 不要让 Nginx 自己响应 OPTIONS 请求(比如用
if ($request_method = 'OPTIONS') { ... }),否则 FastAPI 的CORSMiddleware完全失效 - 若 Nginx 做了路径重写(如把
/api/代理到后端根路径),注意 FastAPI 的prefix和前端请求路径是否对得上,否则路由 404 也会被误判为跨域失败
真正容易被忽略的是:CORS 配置生效的前提是请求能抵达 FastAPI。Nginx、防火墙、甚至某些云厂商的 WAF 都可能在中间截断 OPTIONS 请求,此时看 FastAPI 日志是空的——得先确认请求到底有没有进来。










