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

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

How can I pre-compress files with mod_deflate in Apache 2.x?

我正在使用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.jsfoo.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是否可以正常工作。


推荐阅读