【问题标题】:Accept-Encoding headers on Cloudfront serving assets from Rails 3.0.x on Heroku Cedar在 Heroku Cedar 上的 Rails 3.0.x 服务资产的 Cloudfront 上的 Accept-Encoding 标头
【发布时间】:2012-02-05 13:23:37
【问题描述】:

当我使用我的 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'd。所以我想知道我需要在这里做什么才能让 Cloudfront 从我的应用程序请求一个 gzip 版本的资产,以便它可以将其提供给客户端。

This post 说您需要手动 gzip 并上传文件,但我不明白为什么需要这样做。一来烦人,二来不会直接请求和我的浏览器一样的文件吗?那么,为什么它不像我的应用程序中默认那样提供 gzip 文件呢?

任何关于让 gzip'ng 正常工作的提示都会很棒。如果可能的话,我希望不必手动压缩我的文件并上传它们。

【问题讨论】:

    标签: encoding heroku gzip cdn amazon-cloudfront


    【解决方案1】:

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

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

    因此,您看到的 GZipping 要么是错误的标题,要么来自其他地方。因此,如果您刚刚将文件推送到 Cloudfront,那么您看到的只是相同的内容。

    如果您正在考虑通过 CDN 提供压缩资产,我真的建议您考虑升级到 Rails 3.1 并使用资产管道。这不仅可以让您更好地控制资产,还可以让您更轻松地访问serving them over a CDN

    【讨论】:

    • 所以事实证明,我有指向 heroku.com 的 A 记录,而不是文档建议的 CNAME-ing herokuapp.com。在这种情况下,它实际上是通过 Varnish 过滤我的请求。它正在压缩所有内容。我现在已经更改了它,我将使用Rack::Deflater,直到我可以真正升级到 Rails 3.1(这显然是我的第一选择,但对我来说可能不是 ATM)
    • 超级好,很高兴能帮上忙——请随意勾选我的答案;)
    • 仅供参考,我认为您引用的那篇文章中的任何内容都没有必要。 Cloudfront 抓取我通过 Accept-Encoding 标头传递的文件,然后将它们缓存在其 CDN 中。我看不出有任何理由手动同步我的资产。是的,第一个请求会很慢,但后续请求会很快并从 CDN 提供服务。再次感谢您的提示。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-20
    • 1970-01-01
    • 2011-09-13
    • 1970-01-01
    • 2018-04-28
    • 2014-03-31
    • 2017-11-12
    相关资源
    最近更新 更多