【问题标题】:Generating tar.gz file with PHP, file being double compressed用 PHP 生成 tar.gz 文件,文件被双重压缩
【发布时间】:2016-07-12 14:17:16
【问题描述】:

我有一个 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 标头。

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


但我知道这是 XY 问题的一个示例,因为 正确 解决方法是禁用 Apache 的额外压缩。 但是,我不想为我的站点的其余部分禁用压缩。 如何让 PHP 告诉 Apache 不要 gz 压缩该特定输出?

【问题讨论】:

  • 您可以为 apache 中的特定内容禁用 gzip。您无需为整个网站禁用它。

标签: php apache gzip


【解决方案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 周期。

【讨论】:

  • 如果我错了,请原谅我,但这不起作用,因为就 Apache 而言,.php 扩展名映射到 MIME 类型的 text/html,所以结果是输出来自 PHP 的脚本总是被压缩,包括我的动态 .tar.gz 档案,即使我设置了与 PHP 不同的内容类型。
  • 对某些 php 文件禁用压缩仅对您来说就足够了吗?尝试:SetEnvIfNoCase Request_URI "\.(php)$" no-gzip dont-vary 你也可以改变请求 uri 来描述你的 php 文件,输出不应该被压缩。
猜你喜欢
  • 2013-04-27
  • 2011-11-01
  • 1970-01-01
  • 2018-06-26
  • 2013-04-29
  • 2011-10-30
  • 1970-01-01
  • 2011-04-27
  • 1970-01-01
相关资源
最近更新 更多