Encoding 接受Heroku Cedar上Rails 3.0.x的Cloudfront服务资产上的编码头

Encoding 接受Heroku Cedar上Rails 3.0.x的Cloudfront服务资产上的编码头,encoding,heroku,gzip,cdn,amazon-cloudfront,Encoding,Heroku,Gzip,Cdn,Amazon Cloudfront,当我使用Rails应用程序通过Heroku的Cedar stack(即,不是通过CDN)直接为我的资产提供服务时,它们会自动获得gzip。(请参见我的《我为什么对此感到困惑的原因》) 现在,我正在尝试设置Cloudfront来为这些资产提供服务,理想情况下,我希望它们也是gzip。从我所读到的内容来看,我认为Cloudfront会将Accept标题传递到我的应用程序中,因此如果支持的话,应该提供gzip(就像您在heroku上直接请求资产时一样)。但事实并非如此。资产标题最终看起来如下所示: A

当我使用Rails应用程序通过Heroku的Cedar stack(即,不是通过CDN)直接为我的资产提供服务时,它们会自动获得gzip。(请参见我的《我为什么对此感到困惑的原因》)

现在,我正在尝试设置Cloudfront来为这些资产提供服务,理想情况下,我希望它们也是gzip。从我所读到的内容来看,我认为Cloudfront会将
Accept
标题传递到我的应用程序中,因此如果支持的话,应该提供gzip(就像您在heroku上直接请求资产时一样)。但事实并非如此。资产标题最终看起来如下所示:

Age:510
Connection:keep-alive
Content-Length:178045
Content-Type:text/css
Date:Sun, 08 Jan 2012 18:55:13 GMT
Last-Modified:Sun, 08 Jan 2012 18:42:34 GMT
Server:nginx/0.7.67
Via:1.1 varnish, 1.0 7a0b4b3db0cc0d369fe1d6981bfb646a.cloudfront.net:11180 (CloudFront), 1.0 6af08f4042ec142b4b760ca4cd62041d.cloudfront.net:11180 (CloudFront)
X-Amz-Cf-Id:2b205edf4e9ef000a31a0208ca68f4e15b746eb430cde2ba5cc4b7dff4ba41a76c24f43cf498be02,8d5863a42eea452f86831a02f3eb648b26fe07013b08b95950f15ef8ba275822e1eb3b7ed2550d01
X-Cache:Hit from cloudfront
X-Varnish:2130919357
这里没有提到编码,当我查看普通文件时,它不是gzip'd。所以我想知道我需要在这里做些什么才能让Cloudfront从我的应用程序请求gzip版本的资产,以便它能够为客户端提供服务

说你需要手动gzip并上传文件,但我不明白为什么这是必要的。首先,它很烦人,其次,它不会直接请求与我的浏览器相同的文件吗?那么为什么它不能像在我的应用程序中默认的那样提供gzip文件呢


任何让gzip'ng正常工作的提示都会很好。如果可能的话,我不想手动gzip我的文件并上传它们。

Cedar服务的文件不会被堆栈gzip,Cedar只提供应用程序代码中的任何内容。见:

因为对Cedar应用程序的请求是直接向应用程序发出的 服务器–未通过nginx之类的HTTP服务器代理–任何 必须在应用程序中压缩响应。对于 Rack apps,这可以通过Rack::Deflater实现 中间件。对于gzip静态资源,请确保Rack::Deflater 在中间件堆栈中的ActionDispatch::Static之前加载

因此,GZipping你所看到的要么是一个虚假的标题,要么是来自其他地方。因此,如果您刚刚将文件推送到Cloudfront,那么您将看到相同的情况


如果您正在考虑通过CDN提供压缩资产,我真的建议您考虑使用Rails 3.1并使用资产管道。这不仅可以让你更好地控制你的资产,而且还可以让你更容易地使用它。

因此,事实证明,我有一个指向heroku.com的记录,而不是像文件所建议的那样,指向CNAME ing herokuapp.com。在本例中,它实际上是通过Varnish过滤我的请求。它把一切都打包了。我现在已经更改了,我将使用
Rack::Deflater
,直到我可以真正升级到Rails 3.1(这显然是我的第一选择,但对我来说不太可能),超级,很高兴能帮上忙-请随意勾选我的答案;)仅供参考,我认为你引用的那篇文章中的任何内容都没有必要。Cloudfront获取通过Accept编码头传递的我的文件,然后将它们缓存在其CDN中。我看不出有任何理由手动同步我的资产。第一个请求会很慢是的,但后续请求会很快,并由CDN提供服务。再次谢谢你的提示。