8

mod_deflate がこのシナリオに飛び込むのを防ぐのに問題があります:

  1. CodeIgniter (または index.php にリダイレクトするその他のフレームワーク) を実行しているユーザー
  2. mod_deflate がアクティブです
  3. zip ファイルは CodeIgniter コントローラーによって提供されます (ヘッダー + readfile)

問題は、Apache が常にコンテンツを存在するものとして検出するため、サーバーが ZIP ファイルを PHP ファイルであると想定するため、以下の行のphpようなものが機能しないことです。

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

同じフレームワーク ファイルによって生成された HTML ファイルまたは ZIP ファイルと Apache を区別する方法についてのアイデアindex.php

編集:
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タイプでファイルを収縮させるように指示できなかった理由は不明のままです。

次の手順をスクリプトに強制することで、希望どおりに機能させることができました。

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

これはホットパッチであり、問​​題の根本に対処していないことは理解していますが、これまでのところ、それで十分です。同じフラグを打つ可能性のある他の人がいるので、上記のコードは、ダーティフィックスとは何かを参照するためにここに残ります。

于 2011-06-22T20:03:47.800 に答える
2

次のいずれかを実行できます。

  • 非推奨のものを使用し、AddOutputFilterByTypeフィルタリングしたいコンテンツ タイプのみを指定します。また
  • より強力なを使用してくださいmod_filter。zip コンテンツ タイプ ( ) が応答ヘッダーで見つかったFilterProvider場合にフィルターを除外するルールを指定できます。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 タイプに依存させる必要があり、ファイル拡張子ではありません<FilesMatch>

おそらく、それは一緒にうまく機能します

AddOutputFilterByType DEFLATE text/html

<FilesMatch>指令の代わりに。

編集: .htaccess コンテキストで使用する必要がある L フラグを追加し、さらに no-gzip 環境変数を介して DEFLATE をオフにしました。

于 2011-06-20T00:45:38.057 に答える
1

これを試してください (URL が .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

このように、 content-type が上記のディレクティブと一致する場合にのみ、出力が圧縮されます。

zip を提供する CI コントローラーは既に正しい content-type ヘッダーを送信しているため、これは圧縮されません。

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