防止PHP提供的zip文件上的mod_deflate

时间:2011-06-20 00:25:52

标签: php apache mod-deflate

我遇到了一些麻烦,阻止了mod_deflate加入这种情况:

  1. 用户运行CodeIgniter(或任何其他重定向到index.php的框架)
  2. mod_deflate已激活
  3. zip文件由CodeIgniter控制器(头文件+读取文件)
  4. 提供

    事情是,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);
    

5 个答案:

答案 0 :(得分:6)

即使很难,所有答案都应该在合理的情况下完全有效(并且在提出问题之前进行了实际测试)我之所以无法指示Apache通过MIME-Type缩小文件的原因仍然未知。

通过将以下说明强制进入脚本

,我能够按照自己的意愿工作
apache_setenv('no-gzip', 1);
ini_set('zlib.output_compression', 0);

我确实知道这是一个热补丁,并没有解决问题的根目录,但到目前为止还不够。由于还有其他人可能会遇到相同的标志,上面的代码留在这里作为脏修复的参考。

答案 1 :(得分:2)

你可以:

  • 使用已弃用的AddOutputFilterByType并仅指定您要过滤的内容类型;或
  • 使用功能更强大的mod_filter。在FilterProvider中,您可以提供在响应标头中找到zip内容类型(application/zip)时排除过滤器的规则。

答案 2 :(得分:2)

您可以在Apache级别上使用请求的mod_rewrite to change the mime-type

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

将它置于框架规则之上,但是这需要使用DEFLATE依赖于mime类型而不是文件扩展名,就像使用<FilesMatch>一样。

可能与

一起使用效果很好
AddOutputFilterByType DEFLATE text/html

而不是<FilesMatch>指令。

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

答案 3 :(得分:1)

试试这个(因为你的网址似乎以.zip结尾,它可能适合你):

<FilesMatch "\.(xml|txt|html|php)$">
   SetEnvIf Request_URI "\.zip$" no-gzip
   SetOutputFilter DEFLATE
</FilesMatch>

答案 4 :(得分:0)

而不是使用

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

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

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

这样,只有当content-type与上述指令匹配时,才会压缩输出。

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

header('Content-Type: application/zip');