4

使用 Rack 在 Ruby 中创建静态站点一文之后,我在 Heroku 上获得了一个静态站点config.ru,如下所示:

use Rack::Static,
  :urls => ["/images", "/js", "/css"],
  :root => "public"

run lambda { |env|
  [
    200, 
    {
      'Content-Type'  => 'text/html', 
      'Cache-Control' => 'public, max-age=86400' 
    },
    File.open('public/index.html', File::RDONLY)
  ]
}

当我对结果运行 YSlow 时,它报告没有文件被 gzip 压缩。我该怎么做才能压缩资产和public/index.html

4

1 回答 1

10

根据我之前使用 Sprockets、Sinatra 和 的经验Rack::Deflater,我很确定我use Rack::Deflater离我想要的只是另一条线。

我将其更改config.ru为:

use Rack::Static,
  :urls => ["/images", "/js", "/css"],
  :root => "public"
use Rack::Deflater

run lambda # ...same as in the question

并且我能够验证响应是否已压缩发送:

$ curl -H 'Accept-Encoding: gzip' http://localhost:9292 | file -
/dev/stdin: gzip compressed data

/css但不适用于、/js或下的静态资产/images

$ curl -H 'Accept-Encoding: gzip' http://localhost:9292/css/bootstrap.min.css | file -
/dev/stdin: ASCII English text, with very long lines

就在那时我意识到这是一个标准的中间件堆栈——Rack::Static拦截了对静态文件的调用,从而跳过了下面的堆栈!这就是为什么它适用public/index.html于资产但不适用于资产。

以下config.ru工作(注意use Rack::Deflater现在在前面use Rack::Static):

use Rack::Deflater
use Rack::Static, 
  :urls => ["/images", "/js", "/css"],
  :root => "public"

run lambda { |env|
  [
    200, 
    {
      'Content-Type'  => 'text/html', 
      'Cache-Control' => 'public, max-age=86400' 
    },
    File.open('public/index.html', File::RDONLY)
  ]
}

验证:

$ curl -H 'Accept-Encoding: gzip' http://localhost:9292/css/bootstrap.min.css | file -
/dev/stdin: gzip compressed data, from Unix
于 2013-03-03T20:11:15.570 回答