问题 使用Content-Encoding需要注意的事项:gzip


我创建了一个托管在S3 Bucket上的静态网站。我的资产文件(css和js文件)被缩小并用gzip压缩。文件名本身也是 file_gz.js 要么 file_gz.css  并随附一份 Content-Encoding: gzip 头。

到目前为止,我已经在各种浏览器上测试了网站,它运行正常。资产以压缩版本提供,页面看起来没有任何不同。

我看到的唯一问题是,由于这是一个S3存储桶,因此当客户端(浏览器)不支持gzip编码时,没有故障保护。相反,HTTP请求将失败,并且不会对页面应用样式或javascript增强功能。

有没有人通过设置知道任何问题 Content-Encoding: gzip?所有浏览器都支持这个吗?我需要附加任何其他标题才能使其正常工作吗?


3455
2017-08-28 15:08


起源

为什么gzip压缩文件以.js而不是.gz结尾? - Alexander Mills


答案:


现代浏览器几乎全面支持编码内容。但是,假设所有用户代理都会这样做是不安全的。您的实现的问题是它完全忽略了HTTP的内置方法来避免这个问题: 内容谈判。你有几个选择:

  1. 你可以继续关注这个问题并希望如此 一切 访问您的内容的用户代理将能够解码您的gzip资源。不幸的是,这几乎肯定不是这样的;浏览器不是那里唯一的用户代理,解决问题的“一刀切”方法很少是个好主意。

  2. 实施解决方案,以协商您是否使用.z提供gzipped响应 Accept-Encoding 头。如果客户端根本没有指定此标头或指定它但未提及gzip,则可以相当确定用户将无法解码gzip压缩响应。在这些情况下,您需要发送未压缩的版本。

内容协商的来龙去脉超出了这个答案的范围。你需要做一些关于如何解析的研究 Accept-Encoding 标题并协商您的回复的编码。通常,内容编码是通过使用Apache的mod_deflate等第三方模块来完成的。虽然我不熟悉S3在这方面的选择,但我怀疑你需要自己实施谈判。

综上所述: 发送编码内容而不先用客户端清除它不是一个好主意。


13
2017-08-28 15:52



感谢您的详细帖子。有没有办法重定向 location: ... 对于不接受的内容编码? - matsko
这不是内容协商的工作方式 - 您没有重定向到另一个版本,而是确定要为该特定请求提供哪个版本的内容。不需要重定向。你需要解析的值 Accept-Encoding 标头以确定客户端是否支持gzip响应。 如果 没有 Accept-Encoding 请求标头,HTTP规范要求您以其本机格式(标识)提供资源,而无需任何其他编码。 - rdlowrey
对。但是对于S3,没有内容协商功能。每个URL都映射到一个且只有一个版本的资源。所以我唯一的选择是重定向资源,但它看起来不太可能。 - matsko
就像我说的那样,我不熟悉S3在这方面的能力,但它似乎来自于 这个答案在AWS 您需要确定服务器上的编码并重写链接以返回实际内容或执行重定向到gzip压缩内容。无论您如何操作,在发送之前验证客户端是否可以接受编码的响应非常重要。 - rdlowrey


  1. 你有CSS / minfied CSS(example.css [247 kb])。
  2. 使用cmd gzip -9 example.css 和秘密文件会像 example.css.gz [44 kb]。
  3. 重命名文件 example.css.gz 至 example.css
  4. 将文件上传到S3存储桶,然后在属性中单击元数据。
  5. 添加新的元数据标签,选择 Context-Encoding  和价值 gzip
  6. 现在你的CSS将被缩小并且还会缩小gzip。

资源: http://www.rightbrainnetworks.com/blog/serving-compressed-gzipped-static-files-from-amazon-s3-or-cloudfront/


1
2018-01-22 08:33