API Gateway + Lambda 跨域(CORS)异常问题求助
我来帮你梳理下这个问题——你遇到的是415 Unsupported Media Type和CORS头缺失的组合问题,虽然Postman和Lambda测试正常,但浏览器的跨域请求有特殊的规则(比如预检请求、头信息校验),咱们一步步来排查解决:
先解决415错误(根源问题)
415状态码说明API Gateway无法处理你网页请求发送的媒体类型,这会直接导致后续的CORS头校验失败,浏览器才会抛出那个错误。常见原因和解决方法:
- 检查网页请求的
Content-Type:如果是POST请求,确认你发送的是application/json(如果你的Lambda期望JSON格式),而不是表单数据(application/x-www-form-urlencoded)或其他类型。如果确实需要发送非JSON数据,要在API Gateway对应资源的方法配置里,添加支持的媒体类型。 - 确认API Gateway的集成模式:如果用的是Lambda代理集成,要确保集成请求的「内容处理」设置为「通过代理传递」,这样API Gateway会把原始请求完整传给Lambda,不会因为Content-Type不匹配提前拦截。
再修复CORS头缺失问题
即使API Gateway启用了CORS,也可能因为响应没带正确的头导致浏览器报错,分两种情况处理:
- 如果是非代理集成:检查API Gateway的CORS配置是否完整:
- 确保Allowed Origins设置为
*(测试用)或你的网页域名; - Allowed Headers包含
Content-Type、Authorization等浏览器实际发送的头; - Allowed Methods包含你使用的请求方法(比如POST)以及OPTIONS(预检请求必须);
- 最重要的:修改配置后一定要重新部署API,不然配置不会生效!
- 确保Allowed Origins设置为
- 如果是Lambda代理集成:API Gateway不会自动添加CORS头,必须在Lambda函数的响应中手动返回这些头!比如你的Lambda返回结构要改成这样:
另外,要确保OPTIONS请求也能得到正确响应——可以让API Gateway自动生成OPTIONS方法(启用CORS时勾选「添加OPTIONS方法」),或者在Lambda中处理OPTIONS请求并返回CORS头。# Python示例 def lambda_handler(event, context): return { "statusCode": 200, "headers": { "Access-Control-Allow-Origin": "*", # 或指定你的网页域名 "Access-Control-Allow-Headers": "Content-Type", "Access-Control-Allow-Methods": "POST, OPTIONS" }, "body": json.dumps({"message": "success"}) }
额外排查点
- 你的网页是不是通过
file://协议本地打开的?这种情况下浏览器的Origin会是null,部分浏览器对这种场景的CORS限制更严格,建议把网页放到本地HTTP服务器上测试(比如用python -m http.server启动)。 - 查看CloudWatch日志:检查API Gateway的请求日志,确认请求的Content-Type是否符合预期;查看Lambda日志,确认函数是否被调用,响应头是否正确返回。
内容的提问来源于stack exchange,提问作者Patrick
相关产品推荐
相关产品推荐

