2013-03-03 7 views
4

После Creating Static Sites in Ruby with Rack статьи, я получаю статический сайт на Heroku с config.ru, который выглядит следующим образом:Как включить сжатие gzip для статических сайтов Rack на кедрах Heroku?

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 на результате, он сообщил ни один из файлов не были архивированным. Что мне делать, чтобы сжать как активы, так и public/index.html?

ответ

8

От моего previous experience с цепями, синатрой и 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 intercepts вызов статических файлов и, таким образом, пропускает следующий стек! Вот почему он работал для 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