在 Lambda@Edge 使用 CloudFront 域作为自定义来源时如何停止域重定向?

How to stop domain redirects when using a CloudFront domain as the custom origin at Lambda@Edge?

我想根据我网站的相对路径使用不同的来源

我的根域是 example.com,它应该与 example01.cloudfront.net 一起提供 示例。com/pathxx/ 应与 example02.cloudfront.net 一起提供。 这两个 CloudFront 分配链接到两个带有静态站点的 s3 存储桶。

我已将 example.com 映射到另一个 CloudFront 分配。 以下是我在 Cloudfront 发行版的原始请求触发器上的 Lambda@Edge 使用的代码。

exports.handler = async (event, context, callback) => {
    var request = event.Records[0].cf.request;

    let domain = "";
    if (request.uri.match(/\/pathxx\//)) {
      domain = "example02.cloudfront.net";
      request.uri = request.uri.replace(/\/pathxx\//,"/");
    } else {
      domain = "example01.cloudfront.net";
    }

    request.origin = {
          custom: {
            domainName: domain,
            port: 80,
            protocol: "http",
            path: "",
            sslProtocols: ["TLSv1", "TLSv1.1"],
            readTimeout: 5,
            keepaliveTimeout: 5,
            customHeaders: {}
          }
    };
    
    request.headers["host"] = [{ key: "host", value: domain }];
    callback(null, request);
};

当我使用此代码并在浏览器中输入 example.com 时,它会重定向到 example01.cloudfront.net 示例。com/pathxx 通过接收 301 状态代码重定向到 example02.cloudfront.net

但是,如果我将 CloudFront 来源更改为其 s3 存储桶 URL,则不会发生此重定向,我将始终如我所料看到我的 example.com 域,并且我不会收到任何 301 代码导致重定向。

...
    if (request.uri.match(/\/pathxx\//)) {
      domain = "example02.s3.amazonaws.com";
      request.uri = request.uri.replace(/\/pathxx\//,"/");
    } else {
      domain = "example01.s3.amazonaws.com";
    }
...

这是否意味着我们不能将 CloudFront 分发域用作自定义来源??

由于缓存问题,我必须将 CloudFront 域用于自定义来源,因此我不能使用 s3 存储桶 URL。这是对我的项目架构的限制,并且还使用了旨在实现预缓存的 CloudFront 域。

我刚在 here 找到答案:

当 CloudFront 尝试使用 CloudFront 来源时,它似乎正在经历从 HTTP 到 HTTPS 的重定向,因此我的域在浏览器上发生了变化。

所以,我确实更改了我的两个 CloudFront 发行版(example01.cloudfront.net 和 example02.cloudfront.net)以使用“HTTP 和 HTTPS”选项 “行为”选项卡上来源的查看器协议策略。所以他们不会再强行重定向到 HTPPS。

单个 Cloudfront 分发可以配置为提供来自多个来源的内容(例如 2 个不同的 S3 存储桶)。所以你可以(根本不使用 Lambda)有:

53 号公路

  • example.com -> CloudFront 分发 A

Cloudfront(分布 A)

  • example.com/* -> 来源 s3-bucket-1
  • 示例。com/pathx/ -> 来源 s3-bucket-2

请参阅 this guide 了解演练(使用 API 网关 + S3)。