如何在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.js
和foo.js.gz
都存在,那么/ foo.js
响应将始终是未压缩的(尽pipe对/foo
响应可以正常工作)。
我发现的最简单的解决scheme( 来自FrançoisMarier )是用双文件扩展名重命名未压缩的文件,所以foo.js
被部署为foo.js.js
所以请求/foo.js
在foo.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>
简单而简单:)