gpt4 book ai didi

amazon-web-services - 从AWS中的通配符域提供大量静态站点

转载 作者:行者123 更新时间:2023-12-04 22:27:44 25 4
gpt4 key购买 nike

我在这里遇到了一个非常具体的问题,我们已经拥有并维护了一个系统,该系统涉及使用子域将人员路由到特定应用。

在如下所示的传统服务器上;我们有一个通配符子域* .domain.com,该子域路由到nginx并提供一个文件夹

因此myapp.domain.com> nginx>提供了myapp应用程序文件夹> myapp文件夹包含一个静态站点

我正在尝试以某种方式将此迁移到AWS,我基本上需要在AWS中做类似的事情,我的想法是将每个静态应用程序放入s3存储桶,然后将其放入路由53中的通配符域,但是不确定s3如何知道要使用哪个文件夹,因为该功能不是路由53的一部分

有人有什么建议吗?

感谢你的帮助

最佳答案

CloudFront + Lambda @ Edge + S3可以做到此“无服务器”。

Lambda @ Edge是CloudFront的增强功能,它允许将请求和响应的属性表示为简单的JavaScript对象并进行操作。可以设置触发器以在请求处理期间触发,可以在检查缓存之前(“查看器请求”触发器),也可以在请求进行到后端之前(在这种情况下为S3网站托管端点“起源服务器”)在缓存未命中(“原始请求”触发器)之后...或在响应处理期间,从原始接收到响应之后,才考虑将其存储在CloudFront缓存中(“原始响应”触发器),或者在完成对浏览器的响应(“查看器响应”触发器)。响应触发器还可以检查原始请求对象。

以下代码片段是我最初在AWS论坛上的posted。这是一个Origin Request触发器,用于将原始主机名与您的模式进行比较(例如,域必须匹配*.example.com),如果匹配,则主机名前缀subdomain-here.example.com是来自子域的文件夹中的request。

lol.example.com/cat.jpg        -> my-bucket/lol/cat.jpg
funny-pics.example.com/cat.jpg -> my-bucket/funny-pics/cat.jpg

通过这种方式,可以从单个存储桶中提供任意数量的子域中的静态内容。

为了访问原始传入的 Host header ,即使Lambda函数执行的最终结果将是在源头实际看到该值之前修改该值,也需要将CloudFront配置为 whitelist the Host header for forwarding to the origin

该代码实际上非常简单-以下大多数内容为解释性注释。

'use strict';

// if the end of incoming Host header matches this string,
// strip this part and prepend the remaining characters onto the request path,
// along with a new leading slash (otherwise, the request will be handled
// with an unmodified path, at the root of the bucket)

const remove_suffix = '.example.com';

// provide the correct origin hostname here so that we send the correct
// Host header to the S3 website endpoint

const origin_hostname = 'example-bucket.s3-website.us-east-2.amazonaws.com'; // see comments, below

exports.handler = (event, context, callback) => {
const request = event.Records[0].cf.request;
const headers = request.headers;
const host_header = headers.host[0].value;

if(host_header.endsWith(remove_suffix))
{
// prepend '/' + the subdomain onto the existing request path ("uri")
request.uri = '/' + host_header.substring(0,host_header.length - remove_suffix.length) + request.uri;
}

// fix the host header so that S3 understands the request
headers.host[0].value = origin_hostname;

// return control to CloudFront with the modified request
return callback(null,request);
};

请注意,索引文档和来自S3的重定向可能还需要Origin响应触发器,以针对原始请求标准化 Location header 。这将取决于您所使用的S3网站功能。但是以上是一个有效的示例,它说明了总体思路。

请注意,需要按照CloudFront原始设置中的配置将 const origin_hostname设置为存储桶的端点主机名。在此示例中,存储桶位于us-east-2中,并且网站托管功能处于事件状态。

关于amazon-web-services - 从AWS中的通配符域提供大量静态站点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49812706/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com