2010-12-27 9 views
3

Apache2でmod_deflateを使用すると、Apacheはgzipされたコンテンツをチャンクし、Transfer-encoding:chunkedヘッダを設定します。これによりダウンロード時間が短縮されますが、プログレスバーを表示することはできません。Apacheがgzipされたコンテンツをチャンクするのを防ぐ

PHPで圧縮を自分で処理すると、完全に最初にgzipし、Content-lengthヘッダーを設定して、ユーザーに進行状況バーを表示させることができます。

Apacheのデフォルト動作を変更する設定はありますか?Apacheは応答をチャンクする代わりにContent-Lengthヘッダーを設定して、自分で圧縮を処理する必要はありませんか?

答えて

1

あなたはsendBufferSizeで遊んで、1つのチャンクにあなたの応答を入れるのに十分な大きさの値を得ることができます。設定することによって:(「HTTP/1.0クライアントに転送コーディングを送ってはいけませんサーバー。」そうチャンクではない)

はその後chunked contentは、あなたがHTTP/1.0応答を強制することができHTTP/1.1プロトコルの一部でありますあなたのapache設定にforce-response-1.0があります。しかしPHPはこの設定を破ります、それはPHPの既知のバグです。workaroundがあります。

我々はチャンクコンテンツを防止ヘッダとクライアント側の要求を変更しようとすることができますが、W3Cは言う:「転送コーディング 『チャンク』 すべてのHTTP/1.1アプリケーションは、受信してデコードできなければなりません」だから、私は「受け入れ」のようなヘッダがないと思って、サーバがコンテンツをチャンクするのを防ぐことができます。 HTTP/1.0でリクエストを設定しようとすることもできますが、これはリクエストのヘッダではなく、最初の行です.jQueryで可能になるはずです。

HTTP/1.0には大きな問題が1つもありません。「ホスト」ヘッダーは必須ではありません。名前ベースの仮想ホストで作業している場合、HTTP/1.0の要求は引き続き 'ホスト'ヘッダーを使用していることを確認してください。

編集:回避策に記載されている手法を使用すると、PHPコードのApache envを調整できることがわかります。これは特別なgzip形式のコンテンツに対してのみ1.0モードを強制するために使用することができ、HTTP/1.0でアプリケーションを完了させないようにするために使用する必要があります(またはgzip要求に対してHTTP/1.0を設定する要求モードを使用します)。

+0

ありがとうございますが、これはすべてPHPでの圧縮処理よりも複雑です。 – yclevine

+0

チャンクされたレスポンスにcontent-lenghtヘッダー設定を強制しようとしましたか?複雑さについて私は単純な "apache_setenv( 'force-response-1.0'、 'true');を使用するとは思わない;あなたのコンテンツをgzippedにレンダリングしているPHPスクリプトでは難しいですが、それはあなた次第です:-) – regilero

+0

コンテンツ長とチャンク転送コードを一緒に使うことはできません。複雑さについては、私はちょうどその場合のPHPでの圧縮を処理することができることを意味しました。 – yclevine

関連する問題