根据我之前使用 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