AWS API 网关 - 具有特定域的 CORS

AWS API Gateway - CORS with specific domain

我有一个 Lambda 函数与启用了 CORS 的 API 网关集成。我正在使用 LAMBDA_PROXY 集成,所以我知道我必须在 Lambda 函数的响应中指定 Access-Control-Allow-Origin header。但是,我只想允许来自特定域 (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 网关控制台)时,它 returns 成功 (200) 响应。我希望因为我是从 AWS Api 网关控制台调用端点而不是从 https://www.example.com 端点应该返回非 200 状态代码。

我可以在我的回复中看到 Access-Control-Allow-Origin header -

如果我的原始域不是 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 header)。无论如何,它看起来像预期的那样运行。

我确实发现有趣的是,我的浏览器允许我直接访问端点而不会抛出 CORS 错误。感谢您的意见。

CORS 不是一种控制 服务器 行为的机制;它用于告诉浏览器如何操作。

请求会成功(即 return 200),但同源策略将阻止外部站点读取响应,除非有 CORS 指令允许它。