防止 Cloudfront 将部分路径转发到原始服务器

防止 Cloudfront 将部分路径转发到原始服务器

背景: 我有一个 S3 Bucket(Origin 1),它使用 Cloudfront 为域下的静态网站提供服务example.com

目标:

另外,我想example.com/subfolder提供来自(来源 2)的内容second.com。为了满足以下条件example.com/subfolder = second.com

现在:

在 Cloudfront 发行版中,我设置了 Origin 1Default (*) 和 Origin 2 的行为/subfolder*

问题:

example.com/subfolder我正在被服务时second.com/subfolder

问: 我应该如何以及在何处调整 Cloudfronts 行为以不转发 URL 的第一部分。

答案1

CloudFront 本身不支持此功能。

原始请求路径将完整转发到源服务器,只有一种例外:如果源服务器有源路径配置后,该值会在请求发送到原点之前添加到路径的开头(当然,这在这里没有帮助)。

不过,您可以在 CloudFront 处理期间使用Lambda@Edge原始请求触发器。

这种类型的触发器仅在缓存未命中时触发(在检查 CloudFront 缓存之后但在将请求发送到源之前),并允许修改将发送到源的请求...包括路径。如果源的响应可缓存,则存储在 CloudFront 中浏览器最初请求的路径(而不是修改后的路径)下,因此即使触发器修改了路径,缓存仍可正常工作。

从路径中删除第一级的触发代码可能看起来像这样:

'use strict';

exports.handler = (event, context, callback) => {
    const request = event.Records[0].cf.request;           // extract the request object
    request.uri = request.uri.replace(/^\/[^\/]+\//,'/');  // modify the URI
    return callback(null, request);                        // return control to CloudFront
};

有关于此的更多讨论我对一个非常相似的问题的回答Stack Overflow 是上述代码片段的原始来源。它最初是用 Node.js 6.10 编写的,但仍与 Lambda@Edge 接口兼容,后者现在使用较新版本的 Node。或者,如果您愿意,触发器代码也可以用 Python 编写。

您可能还需要安排/subfolder重定向到,/subfolder/以便正确规范化相对于第二个原点的根的路径。

答案2

云锋本机支持这一点!

还有另一种解决方案,它不需要 Lambda@Edge。

我们将您现有的 CloudFront 分发版称为CF-D1

  1. 创建一个新的 CloudFront 分发,CF-D2,具有原始域second.com
  2. 设置原点路径CF-D2以此类推pathsecond.com/path/subfolder返回403404错误。在我的情况下,这只是/
  3. 在中创建自定义错误响应CF-D2返回一个和你实际想要服务的200路径。同样,这可能只是second.com/
  4. 创建新原点CF-D1其范围为CF-D2(例如v786bh23iuy8v4.cloudfront.net
  5. 创建新行为CF-D1将路径模式引导/subfolder到新的CF-D2起源。

现在当你尝试example.com/subfolder访问CF-D1,CloudFront 将把请求定向second.com/path/subfolderCF-D2给出403404。因此它将提供自定义错误响应CF-D2second.com/(或者您设置为错误响应的任何内容)。

相关内容