如何在Apache 2.x中使用mod_deflate预压缩文件?

我通过Apache提供的所有内容与Content-Encoding: zip但即时压缩。 我的内容很多是磁盘上的静态文件。 我想事先gzip文件,而不是每次请求时压缩它们。

我相信这是mod_gzip在Apache 1.x中自动执行的,只是在它旁边有.gz文件。 mod_deflate不再是这种情况。

无论如何,这个function在mod_gzip中是错误的。 在Apache 2.x中, 你可以通过内容协商来做到这一点 。 具体而言,您需要使用Options指令启用MultiViews ,并且需要使用AddEncoding指令指定您的编码types。

用我非常简单的方式来回答自己的问题,

 Options FollowSymLinks MultiViews 

我错过了MultiViews选项。 它在Ubuntu默认的Web服务器configuration中,所以不要像我一样把它关掉。

另外我写了一个快速的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 

我有一个从源代码构build的Apache 2,我发现我不得不在我的httpd.conf文件中修改以下内容:

将多视图添加到选项:

 Options Indexes FollowSymLinks MultiViews 

取消注释AddEncoding:

 AddEncoding x-compress .Z AddEncoding x-gzip .gz .tgz 

评论AddType:

 #AddType application/x-compress .Z #AddType application/x-gzip .gz .tgz 

如果/ some / dir启用了MultiViews,并且/ some / dir / foo不存在,恐怕MultiViews将无法按预期工作:文档说Multiviews的作用是“如果服务器接收到/ some / dir / foo的请求。 ..“,换句话说,如果你在同一个目录下有一个文件foo.js和foo.js.gz,只要激活MultiView就不会导致.gz文件被发送,即使AcceptEncoding gzip头是由浏览器(您可以通过暂时禁用mod_deflate并使用HTTPFox监视响应来validation此行为)。

我不确定是否有解决方法MultiViews(也许你可以重命名原始文件,然后添加一个特殊的AddEncoding指令),但我相信你可以构造一个mod_rewrite规则来处理这个。

虽然这是有点挑剔,但可以使用mod_negotiation服务预压缩的文件。 主要的困难是只有不存在的文件请求被协商 。 因此,如果foo.jsfoo.js.gz都存在,那么/ foo.js响应将始终是未压缩的(尽pipe对/foo响应可以正常工作)。

我发现的最简单的解决scheme( 来自FrançoisMarier )是用双文件扩展名重命名未压缩的文件,所以foo.js被部署为foo.js.js所以请求/foo.jsfoo.js.js (没有编码)和foo.js.gz (gzip编码)。

我把这个技巧与下面的configuration结合起来:

 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> 

我写了一篇文章 ,详细讨论了这个configuration的原因和一些替代方法。

mod_gzip压缩内容。 您可以通过实际login到服务器来预压缩这些文件,并通过shell进行压缩。

 cd /var/www/.../data/ for file in *; do gzip -c $file > $file.gz; done; 

您可以使用mod_cache代理内存或磁盘上的本地内容。 我不知道这是否会按预期与mod_deflate

我有很多大的.json文件。 大多数读者都是在这种情况下。 预览的答案没有谈到返回的“内容types”。

我想要下面的请求透明地返回一个带有“Content-Type:application / json”的预压缩文件,使用带有ForceType的Multiview

 http://www.domain.com/(...)/bigfile.json -> Content-Encoding:gzip, Content-Type: Content-Encoding:gzip 

1)文件必须重命名:“file.ext.ext”

2)多视图与ForceType很好地工作

在文件系统中:

 // Note there is no bigfile.json (...)/bigfile.json.gz (...)/bigfile.json.json 

在你的apacheconfiguration中:

 <Directory (...)> AddEncoding gzip .gz Options +Multiviews <Files *.json.gz> ForceType application/json </Files> </Directory> 

简单而简单:)