我通过 apache 提供所有内容,Content-Encoding: zip
但它会即时压缩。我的大量内容是磁盘上的静态文件。我想事先压缩文件,而不是每次请求时都压缩它们。
我相信,这是mod_gzip
在 Apache 1.x 中自动完成的,但只是将文件与 .gz 放在旁边。情况不再如此mod_deflate
。
我通过 apache 提供所有内容,Content-Encoding: zip
但它会即时压缩。我的大量内容是磁盘上的静态文件。我想事先压缩文件,而不是每次请求时都压缩它们。
我相信,这是mod_gzip
在 Apache 1.x 中自动完成的,但只是将文件与 .gz 放在旁边。情况不再如此mod_deflate
。
无论如何,此功能在 mod_gzip 中放错了位置。在 Apache 2.x 中,您可以使用内容协商来做到这一点。具体来说,您需要MultiViews
使用Options
指令启用,并且需要使用AddEncoding
指令指定编码类型。
用我在配置中遗漏的非常简单的一行来回答我自己的问题:
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
恐怕 MultiViews 不会按预期工作:文档说 Multiviews 工作“如果服务器收到对 /some/dir/foo 的请求,如果 /some/dir 启用了 MultiViews,并且 /some/dir/foo 不存在。 ..",也就是说:如果你有一个文件 foo.js 和 foo.js.gz 在同一个目录下,即使是通过 AcceptEncoding gzip 头传输,仅仅激活 MultiViews 也不会导致发送 .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.js
foo.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>
我写了一篇文章,详细讨论了这种配置的原因和一些替代方案。
我有一个从源代码构建的 Apache 2,我发现我必须在我的httpd.conf文件中修改以下内容:
将多视图添加到选项:
Options Indexes FollowSymLinks MultiViews
取消注释 AddEncoding:
AddEncoding x-compress .Z AddEncoding x-gzip .gz .tgz
评论添加类型:
#AddType application/x-compress .Z #AddType application/x-gzip .gz .tgz
mod_gzip 也可以即时压缩内容。您可以通过实际登录到您的服务器并从 shell 执行此操作来预压缩文件。
cd /var/www/.../data/
for file in *; do
gzip -c $file > $file.gz;
done;
您可以使用mod_cache
代理内存或磁盘中的本地内容。我不知道这是否会按预期工作mod_deflate
。
我有很多大的 .json 文件。大多数读者都处于这种情况。预览答案没有谈论返回的“内容类型”。
我希望以下请求透明地返回带有“Content-Type:application/json”的预压缩文件,请使用 Multiview 和 ForceType
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
在您的 apache 配置中:
<Directory (...)>
AddEncoding gzip .gz
Options +Multiviews
<Files *.json.gz>
ForceType application/json
</Files>
</Directory>
简短而简单:)