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

时间:2008-09-16 18:30:41

标签: apache http gzip mod-deflate content-encoding

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

我相信,这是mod_gzip在Apache 1.x中自动执行的操作,但只是将文件与.gz放在一起。 mod_deflate已不再是这种情况。

8 个答案:

答案 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.jsfoo.js.gz,则/foo.js的响应将始终未解压缩(尽管/foo的响应可以正常工作)。

我找到的最简单的解决方案(from François Marier)是使用双重文件扩展名重命名未压缩文件,因此foo.js部署为foo.js.js,因此请求/foo.jsfoo.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>

简短而简单:)