.NET Core 6 Lambda响应CORS头被AWS API Gateway移除问题排查
我有一个.NET Core 6.0 AWS Lambda端点,通过CloudWatch日志可以看到,Lambda返回的响应中包含Access-Control-*相关CORS头,示例如下:
{ "statusCode": 200, "headers": { "content-Type": "application/json", "cache-Control": "no-cache, no-store, must-revalidate", "pragma": "no-cache", "expires": "0", "access-Control-Allow-Origin": "*", "access-Control-Allow-Methods": "GET, POST, PUT, DELETE, OPTIONS", "access-Control-Allow-Headers": "Content-Type, Authorization" }, "multiValueHeaders": null, "body": "{\"version\":\"1.0.0\"}", "isBase64Encoded": false }
但通过CURL或Postman调用该API端点时,响应中并未出现这些Access-Control-*头,其余头信息均正常返回。
为测试我已将API Gateway的CorsConfiguration设置为:
Access-Control-Allow-Origin: * Access-Control-Allow-Headers: * Access-Control-Allow-Methods: * Access-Control-Expose-Headers: *
(后续会进一步限制配置,目前仅尝试让其正常工作。)
请问响应传递到客户端的过程中,这些Access-Control-*头被移除的可能原因是什么?
API Gateway CORS配置与Lambda返回头冲突
当API Gateway启用CORS配置后,会自动生成并返回标准的CORS头,此时会优先使用网关层面的配置,覆盖Lambda返回的对应头。解决方式二选一:要么仅在API Gateway配置CORS(移除Lambda中返回的CORS头),要么关闭API Gateway的CORS配置,完全由Lambda返回的头控制CORS逻辑。API Gateway响应映射模板过滤了头
检查API Gateway的集成响应设置,若配置了响应映射模板,可能模板未包含Lambda返回的Access-Control-*头,导致这些头被过滤。需确保响应模板会将Lambda返回的headers字段中所有内容都传递到客户端。API Gateway配置修改后未部署
修改API Gateway的CORS配置后,必须重新部署API才能让新配置生效。若仅修改配置未部署,旧配置仍在运行,会导致CORS头不按预期返回。OPTIONS预检请求处理异常
即使测试的是普通请求,若API Gateway的OPTIONS方法处理不正确,也可能影响后续请求的CORS头返回。确保API Gateway已正确配置OPTIONS方法(比如通过自动生成的OPTIONS处理逻辑),或Lambda能正确响应OPTIONS请求并返回对应CORS头。响应头大小写格式问题
Lambda返回的头使用了access-Control-Allow-Origin(小写开头),虽然HTTP头本身大小写不敏感,但部分网关或代理可能对格式有要求。建议统一改为标准的首字母大写格式(如Access-Control-Allow-Origin),避免解析时被忽略。
内容的提问来源于stack exchange,提问作者Billy McCafferty

