AWS:在同一域下服务多个站点

时间:2019-01-16 15:42:05

标签: amazon-web-services amazon-s3 aws-api-gateway api-gateway

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

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

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

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

还有什么其他方法可以达到相同的结果?

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

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

如果您将域名托管在Amazon之外,则可以使用CNAME中的Route 53或fwd地址。

请阅读以下链接以获取详细信息

答案 2 :(得分:0)

解决方案#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网关中配置二进制文件的模仿类型

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

因此,例如,如果您在APIG中将image/*配置为二进制模仿类型,则对图像的请求应具有Accept标头,其值为image/png,{{1} }或image/jpg。如果标头丢失或具有其他值,APIG不会将响应视为二进制文件。

这里的问题是浏览器通常在尝试加载从CSS导入的资源时发送image/*

因此,唯一的解决方案是将Accept: */*配置为二进制模仿类型。这将破坏此API网关提供的所有非二进制响应,例如JSON。

解决方案3:分别托管二进制文件

这是前两种方法的组合。您可以只创建一个单独的静态网站托管,然后将二进制文件放在其中。