【问题标题】:AWS: serve multiple sites under the same domainAWS:为同一域下的多个站点提供服务
【发布时间】:2019-06-10 17:55:20
【问题描述】:

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

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

    您可以使用 AWS CloudFront 轻松实现此目的。使用行为根据路径选择原点。 CloudFront 具有与 S3 的内置集成。

    【讨论】:

    • 有一个行为将 /site/a/* 指向存储桶“A”,它将所有请求转发到“A/site/a”,所以我需要一个文件夹“/site我的存储桶“A”中的 /a”和存储桶“B”中的“/site/b”。有没有办法将“/site/a/*”指向存储桶“A”的根?我不希望我的存储桶包含这些子路径。
    • @Girafa 进行路径重写,您可以使用 Lambda@Edge 原始请求触发器在 CloudFront 后端重写路径,然后再将它们发送到存储桶。将 CloudFront 和一个 Lambda@Edge 触发器一起使用仍然是比 API Gateway 成本更低的解决方案。
    • 听起来很有趣。我会尝试。谢谢
    【解决方案2】:

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

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

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

    详情请阅读以下链接

    【讨论】:

    • 谢谢。基本上,我希望两个网站在同一个域下的原因是我想在它们之间共享 WebStorage。将它们放在子域下会打破这一要求。不过还是谢谢你的回答。
    • 你不想使用 nginx 吗?
    • “共享网络存储” ...这是什么意思?
    • @vaquarkhan 你的意思是在 Fargate 容器中运行 nginx,而不是使用更高级别的 API 网关或其他资源?
    • @Michael-sqlbot localStorage 和 sessionStorage
    【解决方案3】:

    解决方案 #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 Gateway 中配置二进制文件 Mimetypes

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2018-03-20
      • 2017-05-22
      • 2018-09-23
      • 1970-01-01
      • 2018-09-06
      • 1970-01-01
      • 2014-07-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多