背景:
我有一个 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。
- 创建一个新的 CloudFront 分发,CF-D2,具有原始域
second.com
- 设置原点路径CF-D2以此类推
path
,second.com/path/subfolder
返回403
或404
错误。在我的情况下,这只是/
。 - 在中创建自定义错误响应CF-D2返回一个和你实际想要服务的
200
路径。同样,这可能只是second.com
/
- 创建新原点CF-D1其范围为CF-D2(例如
v786bh23iuy8v4.cloudfront.net
) - 创建新行为CF-D1将路径模式引导
/subfolder
到新的CF-D2起源。
现在当你尝试example.com/subfolder
访问CF-D1,CloudFront 将把请求定向second.com/path/subfolder
到CF-D2给出403
或404
。因此它将提供自定义错误响应CF-D2即second.com/
(或者您设置为错误响应的任何内容)。