Ott*_*tto 34 apache gzip http content-encoding mod-deflate
我通过apache提供所有内容,Content-Encoding: zip但即时压缩.我的大量内容是磁盘上的静态文件.我想事先gzip文件,而不是每次请求时压缩它们.
我认为,这是mod_gzip在Apache 1.x中自动执行的操作,但只是将文件与.gz放在一起.不再是这种情况了mod_deflate.
Ari*_*zis 13
无论如何,这个功能在mod_gzip中放错了位置.在Apache 2.x中,您可以通过内容协商来实现.具体来说,您需要启用MultiViews与Options指令,你需要与指定的编码类型的AddEncoding指令.
为了回答我自己的问题,我在配置中遗漏了一条非常简单的线:
Options FollowSymLinks MultiViews
Run Code Online (Sandbox Code Playgroud)
我错过了MultiViews选项.它在Ubuntu默认的Web服务器配置中,所以不要像我一样放下它.
我还写了一个快速Rake任务来压缩所有文件.
namespace :static do
desc "Gzip compress the static content so Apache doesn't need to do it on-the-fly."
task :compress do
puts "Gzipping js, html and css files."
Dir.glob("#{RAILS_ROOT}/public/**/*.{js,html,css}") do |file|
system "gzip -c -9 #{file} > #{file}.gz"
end
end
end
Run Code Online (Sandbox Code Playgroud)
小智 5
恐怕MultiViews不能按预期工作:文档说Multiviews可以工作:“如果服务器收到对/ some / dir / foo的请求,如果/ some / dir启用了MultiViews,并且/ some / dir / foo不存在。 ..”,换句话说:如果您在同一目录中有文件foo.js和foo.js.gz,即使激活了MultiViews,即使通过Windows传输了AcceptEncoding gzip标头,也不会导致发送.gz文件。浏览器(您可以通过临时禁用mod_deflate并使用HTTPFox监视响应来验证此行为)。
我不确定MultiViews是否可以解决此问题(也许您可以重命名原始文件,然后添加特殊的AddEncoding指令),但是我相信您可以构造一个mod_rewrite规则来处理此问题。
mod_negotiation尽管有点挑剔,但可以使用预压缩文件提供服务。主要的困难是只协商不存在的文件请求。因此,如果foo.js与foo.js.gz同时存在,以便回复/foo.js永远是未压缩的(虽然反应/foo会正常工作)。
我发现的最简单的解决方案(来自 François Marier)是使用双文件扩展名重命名未压缩的文件,因此foo.js部署为(无编码)和(gzip 编码)之间foo.js.js的/foo.js协商请求。foo.js.jsfoo.js.gz
我将该技巧与以下配置相结合:
Options +MultiViews
RemoveType .gz
AddEncoding gzip .gz
# Send .tar.gz without Content-Encoding: gzip
<FilesMatch ".+\.tar\.gz$">
RemoveEncoding .gz
# Note: Can use application/x-gzip for backwards-compatibility
AddType application/gzip .gz
</FilesMatch>
Run Code Online (Sandbox Code Playgroud)
我写了一篇文章,详细讨论了这种配置的原因和一些替代方案。