我有一个与启用了CORS的API网关集成的Lambda函数。我正在使用LAMBDA_PROXY集成,所以我知道我必须在Lambda函数的响应中指定Access-Control-Allow-Origin
标头。但是,我只想允许来自特定域(www.example.com)的跨资源共享。
Lambda函数 -
'use strict'
module.exports.handler = (event, context, callback) => {
const response = {
statusCode: 200,
headers: {
"Access-Control-Allow-Origin": "https://www.example.com"
},
body: JSON.stringify({
message: 'Go Serverless v1.0! Your function executed successfully!'
}),
};
callback(null, response);
};
当我执行测试GET请求(来自API网关控制台)时,它会返回一个成功的(200)响应。我希望因为我从AWS Api网关控制台调用端点而不是https://www.example.com端点应该返回非200状态代码。
我可以在回复中看到Access-Control-Allow-Origin
标题 -
如果我的原始域名不是https://www.example.com,为什么我会获得200状态代码?
此外,我尝试从S3中的网站静态托管网站进行Ajax调用。我仍然得到200响应和JSON数据,即使我显然没有从www.example.com拨打电话。
修改
我最终重新创建资源只是为了向这个问题添加一个实例。
当我直接点击API端点时,它允许我返回JSON数据(我使用的是Google Chrome 64.0.3282.186和FireFox 58.0.2)。
https://w69y8dk663.execute-api.us-east-1.amazonaws.com/dev/api/status
但是,当我从静态托管的s3网站发出Ajax请求时,我收到错误。
http://test-cors-ajax.s3-website-us-east-1.amazonaws.com/
我昨天测试了ajax并且它让我得到了JSON数据,某些东西必须在某处缓存(运行没有allow-access-origin头的旧代码)。无论如何,它看起来像预期的那样运作。
我觉得有趣的是我的浏览器让我直接点击端点而不会抛出CORS错误。感谢您的投入。
答案 0 :(得分:2)
CORS不是用于控制服务器行为的机制;这是为了告诉浏览器如何表现。
请求将成功(即返回200
),但同源策略将阻止外部站点读取响应,除非有CORS指令允许它。