4

ラック記事を使用して 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

SprocketsRack::DeflaterSinatra 、そしてuse Rack::Deflater.

私はこれに変更しconfig.ruました:

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

run lambda # ...same as in the question

そして、応答が gzip で送信されたことを確認できました。

$ 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::Deflateruse 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 に答える