34

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

我相信,这是mod_gzip在 Apache 1.x 中自动完成的,但只是将文件与 .gz 放在旁边。情况不再如此mod_deflate

4

8 回答 8

13

无论如何,此功能在 mod_gzip 中放错了位置。在 Apache 2.x 中,您可以使用内容协商来做到这一点。具体来说,您需要MultiViews使用Options指令启用,并且需要使用AddEncoding指令指定编码类型。

于 2008-09-16T18:53:16.897 回答
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
于 2008-09-18T21:25:54.033 回答
5

恐怕 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 规则来处理这个问题。

于 2012-02-07T00:15:21.383 回答
5

mod_negotiation虽然有点挑剔,但可以使用预压缩文件提供服务。主要困难是只协商对不存在的文件的请求。因此,如果foo.js两者foo.js.gz都存在,则对的响应/foo.js将始终未压缩(尽管对的响应/foo将正常工作)。

我发现的最简单的解决方案(来自 François Marier)是使用双文件扩展名重命名未压缩文件,因此foo.js部署为在(无编码)和(gzip 编码)之间进行协商的foo.js.js请求。/foo.jsfoo.js.jsfoo.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>

写了一篇文章,详细讨论了这种配置的原因和一些替代方案。

于 2016-01-21T18:54:21.213 回答
4

我有一个从源代码构建的 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
于 2009-03-04T02:30:42.403 回答
1

mod_gzip 也可以即时压缩内容。您可以通过实际登录到您的服务器并从 shell 执行此操作来预压缩文件。

cd /var/www/.../data/
for file in *; do
    gzip -c $file > $file.gz;
done;
于 2008-09-16T18:59:48.253 回答
0

您可以使用mod_cache代理内存或磁盘中的本地内容。我不知道这是否会按预期工作mod_deflate

于 2008-09-16T18:55:52.147 回答
0

我有很多大的 .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>

简短而简单:)

于 2014-08-28T19:30:59.050 回答