我正在使用Content-Encoding: zip通过apache提供所有内容,但是会即时压缩。 我的大部分内容是磁盘上的静态文件。 我想事先对文件进行gzip压缩,而不是每次请求时都压缩它们。
我相信mod_gzip是自动在Apache 1.x中完成的,但是旁边只有.gz文件。 mod_deflate不再是这种情况。
无论如何,此功能在mod_gzip中放错了位置。在Apache 2.x中,您可以通过内容协商来实现。具体来说,您需要使用Options指令启用MultiViews,并且需要使用AddEncoding指令指定编码类型。
要用非常简单的一行来回答我自己的问题,我在困惑中不见了:
1
| Options FollowSymLinks MultiViews |
我没有使用MultiViews选项。它位于Ubuntu默认的Web服务器配置中,因此请不要像我一样将其删除。
我还写了一个快速的Rake任务来压缩所有文件。
1 2 3 4 5 6 7 8 9
| 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 |
尽管
mod_negotiation提供预压缩文件。主要的困难在于,仅协商了对不存在的文件的请求。因此,如果同时存在foo.js和foo.js.gz,则对/foo.js的响应将始终是未压缩的(尽管对于/foo的响应将正常工作)。
我找到的最简单的解决方案(来自Fran?ois Marier)是使用双文件扩展名重命名未压缩的文件,因此foo.js部署为foo.js.js,因此对/foo.js的请求在foo.js.js之间协商(无编码)和foo.js.gz(gzip编码)。
我将该技巧与以下配置结合在一起:
1 2 3 4 5 6 7 8 9 10
| 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> |
我写了一篇文章,详细讨论了这种配置的原因以及一些替代方案。
恐怕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规则来处理此问题。
我有一个从源代码构建的Apache 2,发现必须在httpd.conf文件中修改以下内容:
将MultiViews添加到选项:
1
| Options Indexes FollowSymLinks MultiViews |
取消注释AddEncoding:
1 2
| AddEncoding x-compress .Z
AddEncoding x-gzip .gz .tgz |
评论AddType:
1 2
| #AddType application/x-compress .Z
#AddType application/x-gzip .gz .tgz |
mod_gzip也可以动态压缩内容。您可以通过实际登录到服务器并从shell进行压缩来预压缩文件。
1 2 3 4
| cd /var/www/.../data/
for file in *; do
gzip -c $file > $file.gz;
done; |
我有很多大的.json文件。大多数读者都处于这种情况。预览答案没有讨论返回的"内容类型"。
我想要以下请求透明地返回带有" Content-Type:application / json"的预压缩文件,将Multiview与ForceType一起使用
1 2
| http://www.domain.com/(...)/bigfile.json
-> Content-Encoding:gzip, Content-Type: Content-Encoding:gzip |
1)文件必须重命名:" file.ext.ext"
2)Multiview在ForceType上效果很好
在文件系统中:
1 2 3
| // Note there is no bigfile.json
(...)/bigfile.json.gz
(...)/bigfile.json.json |
在您的apache配置中:
1 2 3 4 5 6 7
| <Directory (...)>
AddEncoding gzip .gz
Options +Multiviews
<Files *.json.gz>
ForceType application/json
</Files>
</Directory> |
简短:)
您可以使用mod_cache代理内存或磁盘中的本地内容。我不知道mod_deflate是否可以正常工作。