如何通过AWS CDK启用CORS?解决跨域请求报错问题
解决API Gateway跨域(CORS)问题
你的问题核心在于:仅配置预检请求(OPTIONS)的CORS规则是不够的,实际POST请求的响应也需要返回Access-Control-Allow-Origin头。浏览器不仅会发送OPTIONS预检请求,还会检查实际请求的响应头是否包含跨域允许的字段。
问题分析
你通过addCorsPreflight配置了OPTIONS请求的处理,但这个方法只负责处理浏览器的预检请求,不会自动为POST请求添加响应头。当浏览器收到POST响应时,如果没有Access-Control-Allow-Origin头,就会抛出你看到的错误。
两种解决方案
方案1:在Lambda函数中返回CORS响应头
直接修改你的Lambda代码,在返回结果中添加跨域头。比如Node.js的Lambda示例:
exports.handler = async (event) => { const response = { statusCode: 200, headers: { "Access-Control-Allow-Origin": "*", // 生产环境建议指定具体域名,不要用* "Access-Control-Allow-Headers": "*" }, body: JSON.stringify({ message: "请求成功" }) }; return response; };
方案2:通过CDK配置API Gateway集成响应自动添加头
如果不想修改Lambda代码,可以在CDK中为POST方法的集成响应配置响应头映射:
// 创建POST方法时保存方法对象 const postMethod = users.addMethod("POST"); // 配置集成响应,映射CORS头 postMethod.integration.addResponse("200", { responseParameters: { "method.response.header.Access-Control-Allow-Origin": "'*'" } }); // 声明方法响应包含该头 postMethod.addMethodResponse({ statusCode: "200", responseParameters: { "method.response.header.Access-Control-Allow-Origin": true } });
额外检查点
- 确认CDK代码已部署生效:执行
cdk deploy后,登录AWS控制台查看API Gateway的资源配置,检查OPTIONS方法是否存在,以及POST方法的响应头配置是否正确。 - 生产环境避免使用
*作为允许来源,应指定具体域名(比如["https://your-frontend-domain.com"]),提升安全性。
内容的提问来源于stack exchange,提问作者Moyshe Zuchmir
相关产品推荐
相关产品推荐

