【问题标题】:How to stop domain redirects when using a CloudFront domain as the custom origin at Lambda@Edge?使用 CloudFront 域作为 Lambda@Edge 的自定义源时如何停止域重定向?
【发布时间】:2020-11-11 14:50:01
【问题描述】:

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

我的根域是 example.com,应该使用 example01.cloudfront.net example.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 example.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 域来实现预缓存。

【问题讨论】:

    标签: amazon-web-services amazon-s3 aws-lambda amazon-cloudfront aws-lambda-edge


    【解决方案1】:

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

    Route53

    • example.com -> CloudFront 分发版 A

    Cloudfront(分布 A)

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

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

    【讨论】:

    • 是的,这种方法也应该有效,但我们最终确定了在单个 Cloudfront 发行版上的方法,该发行版与反向代理 (Nginx) 对话,以根据请求的路径选择正确的 s3 源。正如您所提到的,我们知道我们不需要多个 CloudFront 分配来进行缓存,因为我们可以使单个缓存路径无效,并且仍然将兑现的内容保留在其他路径上。
    【解决方案2】:

    我刚刚在here找到答案:

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

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

    【讨论】:

      猜你喜欢
      • 2023-04-05
      • 2020-07-15
      • 2019-02-26
      • 2018-09-05
      • 2015-06-05
      • 1970-01-01
      • 2019-08-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多