在 Lambda@Edge 使用 CloudFront 域作为自定义来源时如何停止域重定向?
How to stop domain redirects when using a CloudFront domain as the custom origin at Lambda@Edge?
我想根据我网站的相对路径使用不同的来源
我的根域是 example.com,它应该与 example01.cloudfront.net 一起提供
示例。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
示例。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 域。
我刚在 here 找到答案:
当 CloudFront 尝试使用 CloudFront 来源时,它似乎正在经历从 HTTP 到 HTTPS 的重定向,因此我的域在浏览器上发生了变化。
所以,我确实更改了我的两个 CloudFront 发行版(example01.cloudfront.net 和 example02.cloudfront.net)以使用“HTTP 和 HTTPS”选项 “行为”选项卡上来源的查看器协议策略。所以他们不会再强行重定向到 HTPPS。
单个 Cloudfront 分发可以配置为提供来自多个来源的内容(例如 2 个不同的 S3 存储桶)。所以你可以(根本不使用 Lambda)有:
53 号公路
- example.com -> CloudFront 分发 A
Cloudfront(分布 A)
- example.com/* -> 来源 s3-bucket-1
- 示例。com/pathx/ -> 来源 s3-bucket-2
请参阅 this guide 了解演练(使用 API 网关 + S3)。
我想根据我网站的相对路径使用不同的来源
我的根域是 example.com,它应该与 example01.cloudfront.net 一起提供 示例。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 示例。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 域。
我刚在 here 找到答案:
当 CloudFront 尝试使用 CloudFront 来源时,它似乎正在经历从 HTTP 到 HTTPS 的重定向,因此我的域在浏览器上发生了变化。
所以,我确实更改了我的两个 CloudFront 发行版(example01.cloudfront.net 和 example02.cloudfront.net)以使用“HTTP 和 HTTPS”选项 “行为”选项卡上来源的查看器协议策略。所以他们不会再强行重定向到 HTPPS。
单个 Cloudfront 分发可以配置为提供来自多个来源的内容(例如 2 个不同的 S3 存储桶)。所以你可以(根本不使用 Lambda)有:
53 号公路
- example.com -> CloudFront 分发 A
Cloudfront(分布 A)
- example.com/* -> 来源 s3-bucket-1
- 示例。com/pathx/ -> 来源 s3-bucket-2
请参阅 this guide 了解演练(使用 API 网关 + S3)。