使用PHP生成tar.gz文件,文件被双重压缩

时间:2016-03-24 20:33:58

标签: php apache gzip

我有一个PHP脚本作为我系统的一部分,它将文件组合成tar.gz,tar.xz或zip文件,并将其传递给浏览网站的用户。

tar.xz和zip文件的下载完美无瑕。 但是对于tar.gz,我没有那么多运气。

我正在使用Apache 2.2.15并启用mod_deflate模块并设置为gzip输出。

如果你使用Accept-Encoding:gzip发出请求,它会发送tar.gz双重压缩(例如gz(gz(tar(...)))),根据我的理解,这是'正确'的方式(即使它是无用的双重压缩)。

我在提交此文件时从PHP中设置标题Content-Type: application/x-gzip

当我这样做时,似乎Firefox在下载时没有反转第二层gzip压缩(Apache正在应用的层)。 当我将内容类型更改为其他内容时,问题不会发生,我得到了正确的tar.gz文件。 在这两种情况下,Apache都会添加另一层压缩并发送Content-Encoding: gzip标头。

如何在保留所需内容类型的同时解决此问题,以便用户可以在正确的程序中实际打开文件?

但我知道这是XY问题的一个例子,因为正确修复将禁用Apache的额外压缩。 但是,我不想为我的网站的其余部分禁用压缩。 我怎样才能让PHP告诉Apache不要gz压缩那个特定的输出?

1 个答案:

答案 0 :(得分:1)

为什么不为压缩有意义的某些类型的文件设置压缩?

<IfModule mod_deflate.c>
    AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css application/x-javascript application/javascript application/ecmascript application/rss+xml
</IfModule>

任何已经压缩的东西似乎都浪费时间和cpu周期。