我有一个与API网关集成的Lambda函数,启用了CORS . 我正在使用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网关控制台调用 endpoints 而不是从https://www.example.com调用 endpoints 应该返回非200状态代码 .
我可以在回复中看到 Access-Control-Allow-Origin
Headers -
如果我的原始域名不是https://www.example.com,为什么我会获得200状态代码?
此外,我尝试从S3中的网站静态托管网站进行Ajax调用 . 我仍然得到200响应和JSON数据,即使我显然没有从www.example.com拨打电话 .
EDIT:
我最终重新创建了资源,只是为这个问题添加了一个实例 .
当我直接点击API endpoints 时,它允许我返回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头的旧代码) . 无论如何,它看起来像预期的那样运作 .
我觉得有趣的是我的浏览器让我直接点击 endpoints 而不会抛出CORS错误 . 谢谢您的意见 .
1 回答
CORS不是控制服务器行为方式的机制;它是告诉浏览器如何表现的 .
请求将成功(即返回
200
),但同源策略将阻止外部站点读取响应,除非有CORS指令允许它 .