Rails 3.2 + Heroku + S3 + CloudFront:无法提供gzip css js文件

8
我正在使用带有assets_sync插件的Rails 3.2。
我的CSS和JS文件已经创建了一个gz版本。尽管请求标头中要求gzip和deflate,但CloudFront并未提供gzip版本。
我还尝试在asset_sync.rb文件中添加config.gzip_compression = true,但是CloudFront仍然提供未压缩的版本。我已确认可以访问ABC.cloudfront.net/XYZ.css.gz

config.gzip_compression = true 实际上起到了作用。它会用其gzipped版本替换文件,以便CloudFront始终提供压缩版本。您很可能会遇到缓存问题,请尝试重命名文件(或确保文件名和文件内容已更改为摘要)。 - icem
2个回答

4
您的CloudFront分发的来源是S3存储桶吗?如果是,问题在于S3无法正确处理“Accept-Encodings”标头:https://github.com/rumblelabs/asset_sync/issues/153 该问题中概述了一些可能的解决方案。您可以默认提供gzipped文件,因为大多数浏览器(不包括某些移动浏览器)会正确处理它,或者您可以尝试此处概述的解决方案
另一个可能的解决方案是将Varnish缓存层用作CloudFront分发的自定义源:
Internet -> CloudFront -> Varnish -> S3 Bucket
当请求到达CloudFront时,如果还没有在CloudFront中缓存,则将其转发到Varnish。 Varnish将从S3 Bucket中获取未压缩的文件,并根据标头进行压缩,然后将文件发送回CloudFront进行缓存。

你的 asset_sync.rb 文件是否位于 config/initializers 目录下?你是否确保在 Rails 日志中没有看到以下行?“AssetSync:在内置的初始化程序中使用默认配置” - Bijan
最后我决定放弃使用S3,直接使用CloudFront进行服务,但你的答案非常有道理。给你一个奖励 :) - marcgg

1

你是否为你的应用设置了heroku config:add ASSET_SYNC_GZIP_COMPRESSION=true


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接