静态 Amazon S3 文件的 GZIP 压缩

GZIP Compression on static Amazon S3 files

我想在我的网站上实施 GZIP 压缩。我已经在 IIS 上实现了它,并且 HTML 页面按预期成功压缩了

现在问题出在 CSS 和 JS 文件上,我从 Amazon S3 获得。它们根本没有被压缩。我也想压缩它们。

请指导我如何操作。分享 link 对我帮助很大。

更新:我在 S3 文件上添加了 Meta Header 作为 "Content-Encoding:gzip",现在它显示在 Response header 中。文件大小仍然相同,页面 中的特定 CSS 没有影响。而且我什至无法在浏览器中打开它。这是特定 css.

的 [link][1]

谢谢

文件在上传到 Amazon S3 之前应该被压缩。

有关示例,请参阅:

如果您在 S3 存储桶前面使用 CloudFront,则无需手动压缩 HTML 资源(CloudFront 会压缩它们 on-the-fly)。请注意,CloudFront 仅在 gzip 中压缩(无压缩、brotli)并且仅压缩 CSS / JS / HTML(基于 content-type)。请参阅 https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/ServingCompressedFiles.html#compressed-content-cloudfront-file-types。要使其正常工作,您必须将一些 http headers 从 CloudFront 转发到 S3(请参阅文档)。

如果您的S3 bucket中有Cloudfront不支持的资源(通用"binary/octet-stream" mime类型,如"hdr" texture或"nds" ROM),您需要在上传前自行压缩它们到 S3,然后在资源上设置 "content-encoding" http meta。请注意,只有支持 gz 编码的浏览器才能下载和解压缩文件。

如果您不想手动压缩文件 one-by-one,您可以使用 Lambda 函数

  • 在存储桶object(文件)的每个 PUT 上触发
  • 如果文件尚未压缩并且压缩有用,则将原始上传文件替换为压缩版本
  • 将 http headers content-encoding 设置为 gzip

我为此写了一个 GIST,它可以启发你创建自己的过程。参见 https://gist.github.com/psa-jforestier/1c74330df8e0d1fd6028e75e210e5042

并且不要忘记使 Cloudfront 失效(=清除)以应用您的更改。

如果您只想对 S3 存储桶中的现有文件进行 gzip 压缩,您可以为其编写一个 Lambda 函数。将文件读入缓冲区,然后使用 gzip 库将它们压缩并 re-upload 到 S3。这样的事情应该有效:

 gzipped_content = gzip.compress(f_in.read())
                destinationbucket.upload_fileobj(io.BytesIO(gzipped_content),
                                                        final_file_path,
                                                        ExtraArgs={"ContentType": "text/plain"}
                                                )

这里有完整的教程:https://medium.com/p/f7bccf0099c9