用PHP生成tar.gz文件,文件经过双重压缩


Generating tar.gz file with PHP, file being double compressed

我有一个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压缩特定的输出?

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

<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周期。