我遇到了一些麻烦,阻止了mod_deflate加入这种情况:
事情是,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);
答案 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');