8

我在阻止 mod_deflate 出现这种情况时遇到了一些麻烦:

  1. 运行 CodeIgniter(或任何其他重定向到 index.php 的框架)的用户
  2. mod_deflate 处于活动状态
  3. zip 文件由 CodeIgniter 控制器提供(标题 + 读取文件)

问题是 Apache 总是将内容检测为存在php,因此像下面的行这样的东西不会起作用,因为服务器假定 ZIP 文件是 PHP 文件。

<FilesMatch "\.(xml|txt|html|php)$">
   SetOutputFilter DEFLATE
</FilesMatch>

关于如何让 Apache 与由同一index.php框架文件生成的 HTML 文件或 ZIP 文件区分开来的任何想法。

编辑:
apache日志

[Mon Jun 20 02:14:19 2011] [debug] 
mod_deflate.c(602): [client 192.168.0.5] 
Zlib: Compressed 50870209 to 50878224 : URL /index.php, 
referer: http://demo.dev/

编辑:
为 zip 提供服务的 CI 控制器

header('Content-Type: application/zip');
header('Content-Transfer-Encoding: binary');
header("Content-Length: " . filesize($file_location)); 
header('Content-Disposition: attachment; filename="' . $file_title . '"'); 
readfile($file_location);
4

5 回答 5

6

即使是艰难的所有答案在合理的情况下也应该是完全有效的(并且在提出问题之前已经过实际测试)为什么我无法指示 Apache 通过 MIME-Type 对文件进行压缩的原因仍然未知。

通过将以下说明强制到脚本中,我能够让它按需要工作

apache_setenv('no-gzip', 1);
ini_set('zlib.output_compression', 0);

我确实知道这是一个热门补丁,并没有解决问题的根源,但到目前为止就足够了。由于还有其他人可能会遇到相同的标志,因此上面的代码保留在这里以供参考什么是脏修复。

于 2011-06-22T20:03:47.800 回答
2

您可以:

  • 使用已弃用的AddOutputFilterByType并仅指定您想要过滤的内容类型;或者
  • 用得越厉害mod_filter。您可以在响应标头中找到FilterProviderzip 内容类型 ( ) 时提供排除过滤器的规则。application/zip
于 2011-06-20T00:37:29.830 回答
2

您可以使用Apache 级别mod_rewrite 更改请求的 MIME 类型:

# Serve .zip request as zip-files
RewriteRule \.zip$ - [T=application/zip,E=no-gzip:1]

将它放在框架规则之上,但是这需要使 DEFLATE 也依赖于 mime-type 而不是文件扩展名,就像你使用<FilesMatch>.

可能它与

AddOutputFilterByType DEFLATE text/html

而不是<FilesMatch>指令。

编辑: 添加了应该在 .htaccess 上下文中使用的 L 标志,并通过 no-gzip 环境变量另外关闭了 DEFLATE。

于 2011-06-20T00:45:38.057 回答
1

试试这个(因为您的网址似乎以 .zip 结尾,它可能对您有用):

<FilesMatch "\.(xml|txt|html|php)$">
   SetEnvIf Request_URI "\.zip$" no-gzip
   SetOutputFilter DEFLATE
</FilesMatch>
于 2011-06-20T01:35:47.517 回答
0

而不是使用

<FilesMatch "\.(xml|txt|html|php)$">
   SetOutputFilter DEFLATE
</FilesMatch>

使用此配置设置压缩规则。

AddOutputFilterByType DEFLATE text/html text/plain text/css text/xml application/x-javascript application/javascript

这样,只有当内容类型与上述指令匹配时,您的输出才会被压缩。

为 zip 提供服务的 CI 控制器已经在发送正确的内容类型标头,因此不会被压缩。

header('Content-Type: application/zip');
于 2012-07-23T06:33:00.447 回答