AWS:为同一域下的多个站点提供服务

AWS: serve multiple sites under the same domain

我拥有一个域名my-portal.com。 我想提供来自 my-portal.com/site/a/ 的静态网站。 我想从 my-portal.com/site/b/.

提供另一个静态网站

我如何使用 AWS 提供的资源来做到这一点?

我试图将两个网站设置为两个单独的 S3 存储桶并启用静态网站托管,然后创建一个 API 网关,其中资源 /site/a/site/b 配置为 HTTP 代理S3 网站。

此设置在大多数情况下都能正常工作。 但是当浏览器试图从我的静态网站加载二进制文件(字体、图像等)时,API 网关无法正确处理该文件并以损坏的文件进行响应(因为它对二进制文件的行为很奇怪).

我还有哪些其他方法可以达到同样的效果?

您可以创建子域(a 和 b)并在您的网站中使用

  1. 我的-portal.com
  2. a.my-portal.com
  3. b.my-portal.com

如果您在 Amazon 之外托管域,则可以使用路由 53 或 CNAME 中的转发地址。

详情请阅读以下链接

您可以使用 AWS CloudFront 轻松实现这一目标。使用行为 select 基于路径的原点。 CloudFront 具有与 S3 的内置集成。

解决方案 #1:使用 CloudFront + Lambda@Edge

CloudFront 允许配置多个缓存行为,将不同的路径模式路由到各自的来源:

  • https://my-portal.com/site/a => https://bucket-a.s3-website.amazonaws.com/site/a
  • https://my-portal.com/site/b => https://bucket-b.s3-website.amazonaws.com/site/b

唯一的限制是每个 S3 存储桶都应该知道路径并在其中提供相同的文件结构。网站 A 的存储桶应包含文件夹 /site/aB 存储桶应包含文件夹 /site/b.

使用 Lambda@Edge 可以克服这个限制。

解决方案 #2:在 API 网关中配置二进制文件 Mimetypes

API Gateway 允许配置二进制文件 mime 类型。但它要求请求具有与配置的 mime 类型兼容的 Accept header。

因此,例如,如果您将 image/* 配置为 APIG 中的二进制 mimetype,则您对图像的请求应该具有 Accept header 的值image/pngimage/jpg 或只是 image/*。如果 header 缺失或它有其他值,APIG 不会将响应视为二进制文件。

这里的问题是浏览器在尝试加载从 CSS.

导入的资源时通常会发送 Accept: */*

因此,唯一的解决方案是将 */* 配置为二进制 mimetype。这将破坏此 API 网关提供的所有 non-binary 响应,例如 JSON 响应。

解决方案 #3:单独托管二进制文件

这是前两种方法的组合。您可以创建一个单独的静态网站托管并将您的二进制文件放在那里。