【问题标题】:CloudFront with S3 website as origin is not serving gzipped files以 S3 网站为源的 CloudFront 不提供 gzip 文件
【发布时间】:2016-06-06 01:29:40
【问题描述】:

AWS now supports gzipping files through CloudFront

我已按照Serving Compressed Files 中的所有说明进行操作,但 gzipping 无法正常工作。

我有一个 S3 存储桶设置为 CloudFront 用作源的网站。

  • Compress Objects Automatically 已启用
  • 我正在提供具有正确内容类型的文件,例如 application/javascripttext/css
  • 文件在 1,000 和 10,000,000 字节以内
  • 据我所知,S3 网站使用 Content-Length 提供文件
  • 为了更加确定没有缓存任何内容,我既使整个 S3 存储桶失效,又将较新版本的文件上传到 S3。
  • 此外,我使用的网络浏览器 Chrome 确实接受 gzip 压缩文件。

尽管如此,我还是无法让 gzipping 工作。我已经让包括 SSL 在内的所有其他内容都运行良好,您可以在此处访问该站点:https://formulagrid.com/

如果您打开 chrome 控制台,您会注意到从 S3 提供的所有文件都没有经过 gzip 压缩。唯一的 gzip 压缩文件(例如 google 字体)是我从其他 CDN 获取的文件。

【问题讨论】:

  • 感谢您分享实际链接——这应该可以让人们更容易发现正在发生的事情。您的对象存储在 S3 中没有 Content-Encoding: 标头,对吗?他们应该是这样的。如果您可以访问世界其他地方的系统,您可以尝试curl -v 并查看通过不同边缘的请求的行为是否有所不同。
  • @Michael-sqlbot 是的,他们只有Content-Type。我注意到的另一件事是,我的 index.html 似乎实际上正在被 gzip 压缩,但这恰好是不一致的,这让我更加困惑。
  • @Michael-sqlbot 它开始工作了...猜猜它需要一天或什么时间...
  • “在极少数情况下,当 CloudFront 边缘站点异常繁忙时,某些文件可能不会被压缩。” 这是一项新功能,并且可能非常受欢迎。 .. 他们可能在您的边缘位置满足了一些暂时的意外需求。 (也就是说,您要通过它进行测试。)
  • 像这样“召唤”的人通常会受到社区的反对。如果您适当地标记问题,专家看到您的问题。

标签: amazon-web-services amazon-s3 gzip amazon-cloudfront


【解决方案1】:

我今天遇到了同样的错误,并通过向 S3 存储桶添加 CORS 规则来解决它。此规则确保将 Content-Length 标头发送到 Cloudfront,以便可以压缩内容:

S3 > 存储桶 > 权限 > CORS 配置

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
    <CORSRule>
        <AllowedOrigin>*</AllowedOrigin>
        <AllowedMethod>GET</AllowedMethod>
        <MaxAgeSeconds>3000</MaxAgeSeconds>
        <AllowedHeader>Authorization</AllowedHeader>
        <AllowedHeader>Content-Length</AllowedHeader>
    </CORSRule>
</CORSConfiguration>

感谢罗伯特·埃里森:http://ithoughthecamewithyou.com/post/enable-gzip-compression-for-amazon-s3-hosted-website-in-cloudfront

据我所知,这似乎是一个未记录的要求。

【讨论】:

  • 注意:在上面的源代码示例中,Content-Length 拼写错误(由于编辑少于 6 个字符,所以不允许我修复它)。
  • 好收获!谢谢!
  • 我的 js 文件超过 10,000,000 字节。有没有办法压缩超过10,000,000字节的js文件?
【解决方案2】:

由于 Cloudfront 现在只接受 JSON,您必须粘贴以下内容:

[
    {
        "AllowedHeaders": [
            "Authorization",
            "Content-Length"
        ],
        "AllowedMethods": [
            "GET"
        ],
        "AllowedOrigins": [
            "*"
        ],
        "ExposeHeaders": [],
        "MaxAgeSeconds": 3000
    }
]

【讨论】:

    【解决方案3】:

    我的问题是我专门用 utf-8 编码上传了文件。来自文档:

    CloudFront 判断文件是否可压缩:

    文件必须是 CloudFront 压缩的类型。

    文件大小必须在 1,000 到 10,000,000 字节之间。

    响应必须包含 Content-Length 标头,以便 CloudFront 可以 确定文件的大小是否在 CloudFront 的范围内 压缩。如果缺少 Content-Length 标头,CloudFront 不会 压缩文件。

    响应不得包含 Content-Encoding 标头

    【讨论】:

    • 谢谢你,这是一个非常有帮助的答案。
    【解决方案4】:

    我已经尝试了以上所有方法,但 CloudFront 仍然没有压缩我的 S3 存储桶内容。

    我的问题是我已经有一个禁用压缩的现有 Cloudfront 发行版,后来我打开了它。这不知何故不允许考虑压缩。经过许多不成功的变通方法后,我删除了 CloudFront 分配并从一开始就使用压缩重新创建它。这解决了我的问题。

    【讨论】:

    • 您是否尝试过使您的云端分发无效?
    • 是的,我做到了。但它没有被考虑在内。删除分发并在启用压缩的情况下重新创建它就可以了。
    猜你喜欢
    • 1970-01-01
    • 2011-07-23
    • 2020-08-20
    • 2019-09-10
    • 2023-03-13
    • 2018-09-21
    • 2017-08-08
    • 1970-01-01
    • 2016-02-08
    相关资源
    最近更新 更多