You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

FastAPI配置CORSMiddleware不生效,如何正确定义允许的访问源?

问题原因

CORS是浏览器层面的跨域安全控制策略,仅在浏览器环境下生效。服务端CORS中间件的作用是给合法跨域请求的响应添加对应的控制头,由浏览器判断是否拦截响应内容,而非直接在服务端拒绝所有非允许源的请求。

你使用curl、Postman这类工具发起请求时,工具默认不会执行CORS校验逻辑,所以无论请求源是否在允许列表中,都能正常拿到响应,这属于正常现象,不代表CORS配置没有生效。

验证CORS配置生效的正确方法

在curl请求中手动添加Origin请求头,模拟浏览器跨域请求场景:

curl -X 'GET' \
  'http://x.x.x.x:8000' \
  -H 'accept: application/json' \
  -H 'Origin: http://未允许的测试域名' \
  -v

如果源不在你的允许列表中,你会发现响应头中不存在Access-Control-Allow-Origin字段,这种情况下浏览器收到响应后会自动拦截,前端代码无法获取响应内容,说明你的CORS配置已经正常工作。

你当前的CORS配置完全符合FastAPI官方规范,无需调整配置内容,实际部署后前端跨域请求时会自动触发浏览器的CORS校验逻辑。

服务端直接拦截非法源的实现方案

如果你需要在服务端就直接拒绝非允许源的请求,不让非法请求拿到返回内容,可以自定义源校验中间件,示例代码如下:

from fastapi import Request, status
from fastapi.responses import JSONResponse

# 你的允许源列表
ALLOWED_ORIGINS = {"http://xxxxxxx.appspot.com"}

# 注意该中间件要添加在CORSMiddleware之前
@app.middleware("http")
async def origin_check_middleware(request: Request, call_next):
    origin = request.headers.get("origin")
    if origin and origin not in ALLOWED_ORIGINS:
        return JSONResponse(
            status_code=status.HTTP_403_FORBIDDEN,
            content={"detail": "当前请求源不被允许访问"}
        )
    response = await call_next(request)
    return response

内容的提问来源于stack exchange,提问作者cYbersYn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 16:06:03