我通过带有Content-Encoding: zip
的apache提供所有内容,但即时压缩。我的大量内容是磁盘上的静态文件。我想事先gzip文件,而不是每次请求时压缩它们。
我相信,这是mod_gzip
在Apache 1.x中自动执行的操作,但只是将文件与.gz放在一起。 mod_deflate
已不再是这种情况。
答案 0 :(得分:13)
无论如何,此功能在mod_gzip中放错了位置。在Apache 2.x中,you do that with content negotiation。具体而言,您需要使用Options
directive启用MultiViews
,并且需要使用AddEncoding
directive指定编码类型。
答案 1 :(得分:8)
用我在配置中遗漏的非常简单的一行来回答我自己的问题:
Options FollowSymLinks MultiViews
我错过了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
答案 2 :(得分:5)
我担心MultiViews无法按预期工作:文档说Multiviews工作“如果服务器收到/ some / dir / foo请求,if / some / dir启用了MultiViews,/ some / dir / foo不存在...“,换句话说:如果你在同一目录中有一个文件foo.js和foo.js.gz,即使AcceptEncoding gzip头是激活的,只是激活MultiViews也不会导致发送.gz文件由浏览器传输(您可以通过暂时禁用mod_deflate并使用例如HTTPFox监视响应来验证此行为)。
我不确定使用MultiViews是否有办法(也许您可以重命名原始文件,然后添加一个特殊的AddEncoding指令),但我相信您可以构建一个mod_rewrite规则来处理这个问题。
答案 3 :(得分:4)
我有一个从源代码构建的Apache 2,我发现我必须在 httpd.conf 文件中修改以下内容:
将MultiView添加到选项:
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
答案 4 :(得分:4)
可以使用mod_negotiation
提供预压缩文件,尽管它有点挑剔。主要困难是 only requests for files which do not exist are negotiated 。因此,如果同时存在foo.js
和foo.js.gz
,则/foo.js
的响应将始终未解压缩(尽管/foo
的响应可以正常工作)。
我找到的最简单的解决方案(from François Marier)是使用双重文件扩展名重命名未压缩文件,因此foo.js
部署为foo.js.js
,因此请求/foo.js
在foo.js.js
(无编码)和foo.js.gz
(gzip编码)之间进行协商。
我将这个技巧与以下配置结合起来:
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>
我wrote a post讨论了这种配置的原因以及一些替代方案。
答案 5 :(得分:1)
mod_gzip即时压缩内容。您可以通过实际登录服务器并从shell执行预压缩文件。
cd /var/www/.../data/
for file in *; do
gzip -c $file > $file.gz;
done;
答案 6 :(得分:0)
您可以使用mod_cache
代理内存或磁盘上的本地内容。我不知道这是否会像mod_deflate
一样按预期工作。
答案 7 :(得分:0)
我有很多大的.json文件。大多数读者都处于这种情况。预览答案没有谈到返回的&#34;内容类型&#34;。
我希望以下请求返回一个带有&#34; Content-Type:application / json&#34;的预压缩文件。透明地,使用带有ForceType的Multiview
http://www.domain.com/(...)/bigfile.json
-> Content-Encoding:gzip, Content-Type: Content-Encoding:gzip
1)文件必须重命名:&#34; file.ext.ext&#34;
2)Multiview适用于ForceType
在文件系统中:
// Note there is no bigfile.json
(...)/bigfile.json.gz
(...)/bigfile.json.json
在你的apache配置中:
<Directory (...)>
AddEncoding gzip .gz
Options +Multiviews
<Files *.json.gz>
ForceType application/json
</Files>
</Directory>
简短而简单:)