在Heroku Cedar上从Rails 3.0.x提供的Cloudfront服务资产上的Accept-Encoding标头

时间:2012-01-08 20:44:29

标签: encoding heroku gzip cdn amazon-cloudfront

当我使用我的Rails应用程序通过Heroku的Cedar堆栈(即不通过CDN)直接提供我的资产时,他们会自动进行gzip。 (请参阅我的previous question,了解为何我对此感到困惑)

现在,我正在尝试设置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的。所以我想知道我需要做什么才能让Cloudfront从我的应用程序中请求gzip版本的资产,以便它可以为客户提供服务。

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

任何关于让gzip'ng正常工作的提示都会很棒。我希望不必手动gzip我的文件并在可能的情况下上传。

1 个答案:

答案 0 :(得分:3)

Cedar提供的文件不会被堆叠GZip,Cedar只提供应用程序代码中的任何内容。请参阅documentation

  

因为对Cedar应用程序的请求是直接向应用程序发出的   服务器 - 不通过像nginx这样的HTTP服务器代理 - 任何   必须在您的应用程序中完成响应压缩。对于   Rack应用程序,这可以通过Rack :: Deflater完成   中间件。对于gzipped静态资产,请确保Rack :: Deflater   在中间件堆栈中的ActionDispatch :: Static之前加载。

因此GZipping你看到的是一个虚假的标题,或来自其他地方。因此,如果您只是将文件推送到Cloudfront,那么您只是看到同样的事情。

如果你正在寻找通过CDN提供压缩资产的话,我真的建议看看碰撞到Rails 3.1并使用资产管道。这不仅可以让您更好地控制资产,还可以让您更轻松地前往serving them over a CDN