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)并在您的网站中使用
- 我的-portal.com
- a.my-portal.com
- b.my-portal.com
如果您在 Amazon 之外托管域,则可以使用路由 53 或 CNAME 中的转发地址。
详情请阅读以下链接
How to create a domain and a subdomain in AWS?
Create a subdomain that uses Amazon Route 53 as the DNS service without migrating the parent domain
- https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/CreatingNewSubdomain.html
您可以使用 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/a
,B
存储桶应包含文件夹 /site/b
.
使用 Lambda@Edge 可以克服这个限制。
解决方案 #2:在 API 网关中配置二进制文件 Mimetypes
API Gateway 允许配置二进制文件 mime 类型。但它要求请求具有与配置的 mime 类型兼容的 Accept
header。
因此,例如,如果您将 image/*
配置为 APIG 中的二进制 mimetype,则您对图像的请求应该具有 Accept
header 的值image/png
、image/jpg
或只是 image/*
。如果 header 缺失或它有其他值,APIG 不会将响应视为二进制文件。
这里的问题是浏览器在尝试加载从 CSS.
导入的资源时通常会发送 Accept: */*
因此,唯一的解决方案是将 */*
配置为二进制 mimetype。这将破坏此 API 网关提供的所有 non-binary 响应,例如 JSON 响应。
解决方案 #3:单独托管二进制文件
这是前两种方法的组合。您可以创建一个单独的静态网站托管并将您的二进制文件放在那里。
我拥有一个域名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)并在您的网站中使用
- 我的-portal.com
- a.my-portal.com
- b.my-portal.com
如果您在 Amazon 之外托管域,则可以使用路由 53 或 CNAME 中的转发地址。
详情请阅读以下链接
How to create a domain and a subdomain in AWS?
Create a subdomain that uses Amazon Route 53 as the DNS service without migrating the parent domain
- https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/CreatingNewSubdomain.html
您可以使用 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/a
,B
存储桶应包含文件夹 /site/b
.
使用 Lambda@Edge 可以克服这个限制。
解决方案 #2:在 API 网关中配置二进制文件 Mimetypes
API Gateway 允许配置二进制文件 mime 类型。但它要求请求具有与配置的 mime 类型兼容的 Accept
header。
因此,例如,如果您将 image/*
配置为 APIG 中的二进制 mimetype,则您对图像的请求应该具有 Accept
header 的值image/png
、image/jpg
或只是 image/*
。如果 header 缺失或它有其他值,APIG 不会将响应视为二进制文件。
这里的问题是浏览器在尝试加载从 CSS.
导入的资源时通常会发送Accept: */*
因此,唯一的解决方案是将 */*
配置为二进制 mimetype。这将破坏此 API 网关提供的所有 non-binary 响应,例如 JSON 响应。
解决方案 #3:单独托管二进制文件
这是前两种方法的组合。您可以创建一个单独的静态网站托管并将您的二进制文件放在那里。