我拥有一个域名my-portal.com
。
我想从my-portal.com/site/a/
提供一个静态网站。
我想从my-portal.com/site/b/
服务另一个静态网站。
如何使用AWS提供的资源来做到这一点?
我试图将两个网站设置为两个单独的S3存储桶,并启用了静态网站托管,然后创建了一个API网关,其中资源/site/a
和/site/b
被配置为S3网站的HTTP代理。
在大多数情况下,此设置均可正常工作。 但是,当浏览器尝试从我的静态网站加载二进制文件(字体,图像等)时,API网关无法正确处理该文件,并以损坏的文件进行响应(因为它在二进制文件中表现异常)。>
还有什么其他方法可以达到相同的结果?
答案 0 :(得分:1)
您可以使用AWS CloudFront轻松实现这一目标。使用行为来基于路径选择原点。 CloudFront具有与S3的内置集成。
答案 1 :(得分:0)
您可以创建子域(a和b)并在您的网站中使用
如果您将域名托管在Amazon之外,则可以使用CNAME中的Route 53或fwd地址。
请阅读以下链接以获取详细信息
答案 2 :(得分:0)
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可以克服此限制。
API网关允许配置二进制文件mime类型。但它要求请求具有与配置的mime类型兼容的Accept
标头。
因此,例如,如果您在APIG中将image/*
配置为二进制模仿类型,则对图像的请求应具有Accept
标头,其值为image/png
,{{1} }或image/jpg
。如果标头丢失或具有其他值,APIG不会将响应视为二进制文件。
这里的问题是浏览器通常在尝试加载从CSS导入的资源时发送image/*
。
因此,唯一的解决方案是将Accept: */*
配置为二进制模仿类型。这将破坏此API网关提供的所有非二进制响应,例如JSON。
这是前两种方法的组合。您可以只创建一个单独的静态网站托管,然后将二进制文件放在其中。