FastAPI部署于AWS API Gateway时POST/DELETE接口自动添加错误Access-Control-Allow-Origin的问题
看起来你遇到的核心问题是AWS API Gateway的CORS配置优先覆盖了FastAPI返回的响应头,导致POST/DELETE请求的Access-Control-Allow-Origin被替换成API地址,而非你指定的*。下面是具体的排查和解决步骤:
一、先理清冲突根源
当你在API Gateway上部署Serverless应用时,API Gateway本身自带CORS配置能力。如果这个配置和你FastAPI里的CORSMiddleware、手动设置的响应头同时存在,API Gateway会优先使用它自己生成的头——这就是POST/DELETE请求头被替换的原因,而GET请求可能因为没有触发预检(OPTIONS)请求,所以FastAPI的头生效了。
二、分步解决
1. 移除FastAPI路由中重复的手动头设置
你已经在main.py里配置了CORSMiddleware,它会自动为所有请求(包括预检OPTIONS)处理CORS头,手动在每个路由里重复设置头不仅多余,还可能加剧冲突。把每个路由里的这些代码删掉:
response.headers['Access-Control-Allow-Origin'] = "*" response.headers['Access-Control-Allow-Credentials'] = "true" response.headers['Access-Control-Allow-Headers'] = "Origin, X-Requested-With, Content-Type, Accept, x-access-token"
保留CORSMiddleware的配置即可:
app.add_middleware( CORSMiddleware, allow_origins=["*"], allow_credentials=True, allow_methods=["*"], allow_headers=["*"], )
2. 同步AWS API Gateway的CORS配置(关键)
必须让API Gateway的CORS配置和你的需求完全一致,避免它覆盖后端返回的头:
如果用Serverless Framework部署
在serverless.yml的函数API配置中添加CORS规则:
functions: your-fastapi-function: handler: main.app events: - http: path: /{proxy+} method: any cors: origin: '*' credentials: true headers: Origin,X-Requested-With,Content-Type,Accept,x-access-token methods: GET,POST,DELETE,OPTIONS
如果直接在AWS控制台操作
- 进入API Gateway控制台,找到你的目标API;
- 选中
/{proxy+}资源,点击顶部「Actions」→「Enable CORS」; - 在弹窗中填写:
Access-Control-Allow-Origin:*- 勾选
Access-Control-Allow-Credentials Access-Control-Allow-Headers:Origin,X-Requested-With,Content-Type,Accept,x-access-tokenAccess-Control-Allow-Methods:GET,POST,DELETE,OPTIONS
- 点击「Enable CORS and replace existing CORS headers」,然后重新部署API到
dev阶段。
3. 验证结果
部署完成后,用curl测试POST/DELETE请求的响应头,确认Access-Control-Allow-Origin是*:
curl -v -X POST https://xxxxx.execute-api.xx-xxxxxx-x.amazonaws.com/dev/dimensioning
额外说明
当Access-Control-Allow-Credentials设为true时,部分浏览器对*的源有特殊限制,但你的问题根源是API Gateway替换了源,先解决这个问题后,再根据前端实际情况调整(比如如果需要带凭证,后续可以把allow_origins改成具体的前端域名列表)。
内容的提问来源于stack exchange,提问作者some_programmer

