从 S3 和 CloudFront 提供 Angular JS HTML 模板 - CORS 问题

Posted

技术标签:

【中文标题】从 S3 和 CloudFront 提供 Angular JS HTML 模板 - CORS 问题【英文标题】:Serving Angular JS HTML templates from S3 and CloudFront - CORS problems 【发布时间】:2013-03-07 11:54:48 【问题描述】:

我有一段时间尝试从 Amazon CloudFront 提供静态 html 模板。

我可以在 Firefox 上为我在 S3 上托管的 HTML 执行 jQuery.get 就好了。 CloudFront 同样返回一个OPTIONS 403 Forbidden。而且我无法在 Chrome 上为 S3 或 CloudFront 文件执行 ajax get。我认为 Angular 也有同样的问题。

我不知道它如何获取远程模板,但它返回的错误与jQuery.get 相同。根据亚马逊技术支持,我的 CORS 配置很好,正如我所说,我可以直接从 Firefox 上的 S3 获取文件,因此它适用于一种情况。

我的问题是,如何让它在所有浏览器、CloudFront 和 Angular templateUrl 中运行?

【问题讨论】:

在这里回答:***.com/a/24459590/652693 【参考方案1】:

对于来自谷歌的人,更多

事实证明,当 CORS 设置位于 S3 存储桶上时,Amazon 实际上确实通过 SSL 支持 CORS。当云端缓存 CORS 响应的标头时,不好的部分就出现了。如果您从可能混合 http 和 https 的源中获取,您将遇到来自 CloudFront 的允许源会显示 http 但您想要 https 的情况。这当然会导致浏览器崩溃。更糟糕的是,如果您接受压缩内容,CloudFront 将缓存略有不同的版本。因此,如果您尝试使用 curl 进行调试,您会认为一切正常,然后发现它不在浏览器中(尝试将 --compressed 传递给 curl)。

一个无可否认的令人沮丧的解决方案就是放弃整个 CloudFront 并直接从 S3 存储桶提供服务。

【讨论】:

【参考方案2】:

亚马逊目前似乎不支持 CloudFront 或 S3 上的 SSL 和 CORS,这是问题的症结所在。 Limelight 或 Akamai 等其他 CDN 允许您将 SSL 证书添加到 CNAME 以规避该问题,但亚马逊不允许这样做,并且其他 CDN 成本过高。最好的选择似乎是从您自己的域上的服务器提供 html。这是 Angular 和 Rails 的解决方案:https://***.com/a/12180837/256066

【讨论】:

以上是关于从 S3 和 CloudFront 提供 Angular JS HTML 模板 - CORS 问题的主要内容,如果未能解决你的问题,请参考以下文章

从浏览器缓存提供图像时,AWS S3 + CloudFront 会出现 CORS 错误

向客户端提供带有 Cloudfront 内容的 S3

禁止使用 s3 通过 Cloudfront 提供的字体

如何将 CloudFront 和 S3 与备用域一起使用?

在 CloudFront 的账户之间共享 S3 存储桶

将 Amazon S3 存储桶和 Cloudfront 与 SSL Wordpress 站点一起使用不会提供静态文件