從我的previous experience與鏈輪,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
,我能驗證迴應被送往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
這就是當我意識到這是一個標準的中間件堆棧 - 機架::靜態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