web-dev-qa-db-ja.com

Transfer-Encodingを無効にする方法:HTTP / 1.1応答でApacheにチャンク化

HTTP/1.1ブラウザーから要求されたときに、チャンクエンコーディング中に誤った出力を生成するmod_include(SSI)ページがあります。

HTTP/1.0から要求された場合、ページは正常に出力されます(出力がチャンク化されていないため)。

Apacheにどのように伝えることができますか ない HTTP/1.1ブラウザーから要求されたときにチャンクエンコーディングを使用するには

より詳しい情報: 誤ったチャンク出力は、sparcプロセッサを搭載したSolaris 5.10マシンでsendfile()サポートを有効にすることで発生します。 sendfile()サポートを無効にすると、この問題が発生しなくなります。しかし、私はこのバグをキャッチして修正しようとしています。

6
PP.

Content-lengthを事前に指定する場合、Apacheはチャンクを使用する必要はありません。 Content-lengthがないと、Apacheはそれを使用する以外に選択肢がありません。

明確にする必要があります。Apacheは応答を送信する前に、Apacheが応答全体を読み取るため、HTTP/1.0がそれを管理し、その大きさがわかります。これは陽気に非効率的で低速であり、AFAIKはHTTP/1.1リクエストに対してこのロジックを有効にする方法はありません。 、設定する環境変数は "downgrade-1.0" )です

10
BMDan

上記の答えは正しくありません。

リクエストがHTTP/1.0の場合、Apacheは(Content-Lengthヘッダーを使用して)送信する前に応答をバッファリングしません。もちろん、Apacheはそれを行うことができますが、Apacheが使用するより洗練されたソリューションがあります。「Connection:close」ヘッダーで応答し、すべてのデータを送信するとすぐに接続を閉じます。

HTTP仕様 によると、「Connection:close」ヘッダーの存在は、クライアントが接続が閉じるまで読み取る必要があることを意味します。

問題の解決策は、前述の downgrade-1. 環境変数を設定して、Apacheに要求をHTTP/1.0として処理させることです。チャンク化されたTransfer-EncodingはHTTP/1.1の機能であり、ApacheはHTTP/1.0リクエストに使用しません。

例えば。ここでは、phpファイルのチャンク応答を無効にする方法を示します。

++++++++++++
Apache.conf
++++++++++++

<Files *.php>
    SetEnv downgrade-1.0
</Files>
9
andreycpp

Apacheクライアントは、送信される本文のサイズを判別しようとします。特別なインターセプターを使用しない限り、「Content-Length」を事前に指定するとエラーが発生します。

送信するエンティティをチェックして、チャンク化されているか、ボディのサイズ(content-length)<0であるかを確認し、どちらかがtrueの場合は、「Transfer-Encoding = chunked」ヘッダーを使用します。エンティティがチャンクを優先せず、コンテンツ長> -1が見つかった場合、「Content-Length」ヘッダーを使用します。

通常、ボディのソースがMIMEボディパーツである場合、size()メソッドの呼び出しは-1を返すため、 "Transfer-Encoding"を使用します。そのため、MIMEボディパーツをバイト配列に変換すると、数値が返されるため、機能します。配列のバイト数。