【发布时间】: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