创建了一个返回3个HTTP标头的AWS Lamba函数(NodeJS):aaa,Access-Control-Allow-Origin和bbb:
exports.handler = async (event) => {
const response = {
statusCode: 200,
headers: { "aaa":"aaa", "Access-Control-Allow-Origin":"*", "bbb":"bbb" },
body: JSON.stringify('Hello from Lambda!'),
};
return response;
};
该功能已集成到HTTP API(不是REST API)中。在HTTP API网关配置的“配置CORS”部分中,HTTP标头“ Access-Control-Allow-Origin”设置为“ *”。请查看屏幕截图:
命令“ curl -i https://xxxxxxxxxx.execute-api.eu-central-1.amazonaws.com”证明已明确删除了HTTP标头Access-Control-Allow-Origin,因为仅返回了HTTP标头aaa和bbb:
HTTP/2 200
date: Tue, 14 Apr 2020 11:01:58 GMT
content-type: text/plain; charset=utf-8
content-length: 20
aaa: aaa
bbb: bbb
apigw-requestid: K-S2EjVWliAEJKw=
为什么即使执行了“配置CORS”后,此标头仍然不存在?
(我正在谷歌搜索超过两天,以便找到解决方案,这让我发疯了)
答案 0 :(得分:3)
根据Configuring CORS for an HTTP API-
如果为API配置CORS,则API Gateway会忽略CORS标头 从您的后端集成返回。
这就是为什么忽略Lambda(集成)中的CORS标头的原因。这是原始REST API与新HTTP API之间的区别之一。如果使用这些API-
对于CORS请求,API网关将已配置的CORS标头添加到 集成的响应。
进行简单卷曲时,实际上并不是在进行跨域请求。因此,您看不到HTTP API设置的CORS标头。为了验证CORS请求是否有效,我在以下请求中传递了 Origin 标头,然后可以看到CORS标头以及Lambda中的自定义标头-
$ curl -v -X GET https://$API_ID.execute-api.$AWS_REGION.amazonaws.com -H "Origin: https://www.example.com"
< HTTP/2 200
< date: Tue, 14 Apr 2020 18:02:26 GMT
< content-type: text/plain; charset=utf-8
< content-length: 18
< aaa: aaa
< bbb: bbb
< access-control-allow-origin: https://www.example.com
< access-control-expose-headers: date, x-api-id
以下是我在API上的CORS配置的摘录。我将Access-Control-Allow-Origin值添加为https://www.example.com,并将其作为我的curl请求中Origin头文件的一部分传递。这样的请求将被视为CORS。
答案 1 :(得分:3)
对于 Google 员工:
如果您的 OPTIONS
预检成功但不存在 Access-Control-
标头,并且您正在使用 CURL 进行测试,请特别注意拼写所需的标头以用于预检:
如果拼写错误,OPTIONS
会以 204 No Content
成功,但没有 Access-Control-
标头因此导致预检结果无效。
还要检查您是否有足够的参数范围,只要您请求的方法和标头是参数的子集,您将获得 Access-Control-
标头。如果没有,您将得到 204 No Content
,我会说这不是很有用!
答案 2 :(得分:0)