Tim*_*tis 8 amazon-cloudfront amazon-web-services
背景:
我有一个 S3 存储桶(Origin 1),它使用 Cloudfront 在域下提供静态网站example.com。
目标:
另外我想example.com/subfolder提供来自second.com(Origin 2)的内容。为使以下内容为真example.com/subfolder = second.com
现在:
在Cloudfront发行版下,我设置了具有行为的Origin 1Default (*)
和具有行为的Origin 2/subfolder*
问题:
去的时候example.com/subfolder我正在接受服务second.com/subfolder
问: 如何以及在哪里调整 Cloudfronts 行为以不转发 URL 的第一部分。
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
};
Run Code Online (Sandbox Code Playgroud)
我在 Stack Overflow 上对一个非常类似的问题的回答中有更多对此的讨论,这是上面代码片段的原始来源。它最初是用 Node.js 6.10 编写的,但仍然与 Lambda@Edge 接口兼容,后者现在使用较新版本的 Node.js。或者,如果您愿意,也可以用 Python 编写触发器代码。
您可能还需要安排/subfolder重定向,/subfolder/以便正确规范化相对于第二个源的根的路径。