代码之家  ›  专栏  ›  技术社区  ›  Chris Diggs

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

  •  2
  • Chris Diggs  · 技术社区  · 7 年前

    我有一个与启用CORS的API网关集成的Lambda函数。我正在使用LAMBDA\u代理集成,因此我知道必须指定 Access-Control-Allow-Origin Lambda函数中我的响应中的标头。然而,我只想允许来自特定域(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状态代码。

    我可以看到 访问控制允许原点 我的回复中的标题- enter image description here

    如果我的源域名不是 https://www.example.com ??

    此外,我还尝试从S3中静态托管的网站调用Ajax。尽管我显然不是在www.example上打电话,但我仍然收到了200条响应和JSON数据。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错误。感谢您的意见。

    1 回复  |  直到 7 年前
        1
  •  3
  •   Kevin Christopher Henry    7 年前

    CORS不是控制 服务器 行为;这是为了告诉 浏览器 如何表现。

    请求将成功(即返回 200 ),但同源策略将阻止外国网站读取响应,除非CORS指令允许。