行うかどうかに関しては、現状はどうなっていますか
Transfer-Encoding: gzip
または
Content-Encoding: gzip
たとえばclientsを許可したい場合帯域幅をに制限し、圧縮された応答を受け入れる意思があることを通知しますおよびサーバーは、圧縮するかどうかを最終決定権を持ちます。
後者は、たとえばApacheのmod_deflateおよびIISは、圧縮を処理できるようにする場合に行います。圧縮するコンテンツのサイズに応じて、追加のTransfer-Encoding: chunked
を実行します。
また、Vary: Accept-Encoding
も含まれます。これはすでに問題を示唆しています。 Content-Encoding
はエンティティの一部のようです。したがって、Content-Encoding
を変更すると、エンティティが変更されます。つまり、異なるAccept-Encoding
ヘッダーは、キャッシュは、他の点では同一のエンティティのキャッシュバージョンを使用できません。
これについて私が見逃した明確な答えはありますか(そしてそれはいくつかのApacheニュースグループの長いスレッドのメッセージの中に埋もれていません)?
私の現在の印象は:
ETag
に対して何をすべきでしょうか?)したがって、正しい方法はTransfer-Encoding: gzip
(または、さらに本文をチャンクすると、それは になるTransfer-Encoding: gzip, chunked
)になると想定しています。 Vary
やETag
、またはその場合は他のヘッダーに触れる理由はありません。これはトランスポートレベルのものです。
現時点では、Transfer-Encoding
の「ホップバイホップ」性についてはあまり気にしません。他の人が何よりも懸念しているように見えることです。ただし、元のリクエストに適切なAccept-Encoding
ヘッダーが含まれている場合、プロキシはそのまま(圧縮)転送します。これは、私が知っているすべてのブラウザーの場合に与えられます。
ところで、この問題は少なくとも10年前のものです。 https://bugzilla.mozilla.org/show_bug.cgi?id=68517 .
これについての説明は歓迎します。標準準拠と見なされるものと実用的と見なされるものの両方の点で。たとえば、透過的な「Content-Encoding」のみをサポートするHTTPクライアントライブラリは、実用性に反する議論になります。
引用Roy T. Fielding、RFC 2616の著者の1人:
一貫性のない方法でコンテンツエンコードをオンザフライで変更すると(「決して」も「常に」も)、そのコンテンツに関するその後の要求(PUTや条件付きGETなど)を正しく処理できなくなります。 on-the-fly content-encodingは愚かなアイデアであり、リソースを変更せずにon-the-flyエンコーディングを行う適切な方法としてTransfer-EncodingをHTTPに追加した理由です。
ソース: https://issues.Apache.org/bugzilla/show_bug.cgi?id=39727#c31
言い換えると:on-the-flyContent-Encodingを行わず、代わりにTransfer-Encodingを使用してください!
編集:つまり、gzip圧縮されたコンテンツをContent-Encodingのみを理解するクライアントに提供したい場合を除きます。残念ながら、それらのほとんどがそうです。しかし、あなたは仕様の領域を離れて、フィールディングや他の人が言及したような問題に遭遇する可能性があることに注意してください、例えばキャッシュプロキシが含まれる場合。
RFC 2616で定義され実際に実装されている正しいの使用法は、クライアントがAccept-Encoding
要求ヘッダーを送信するためのものです(クライアントは複数のエンコーディングを指定できます)。サーバーは、クライアントのサポートされているエンコード(ファイルデータがまだそのエンコードに保存されていない場合)に従ってレスポンスをエンコードし、そのエンコードのみが使用されているエンコードをContent-Encoding
レスポンスヘッダーで示します。クライアントは、Transfer-Encoding
(つまりchunked
)に基づいてソケットからデータを読み取り、Content-Encoding
(つまり:gzip
)に基づいてデコードできます。
したがって、あなたの場合、クライアントはAccept-Encoding: gzip
リクエストヘッダーを送信し、サーバーはContent-Encoding: gzip
およびオプションでTransfer-Encoding: chunked
レスポンスヘッダーを圧縮して(まだではない場合)送信することを決定します。
はい。リクエストでTransfer-Encoding
ヘッダーを使用できますが、HTTP 1.1の場合にのみ、クライアントとサーバーの両方の実装で双方向のchunked
エンコーディングをサポートする必要があります。
ETag
は、実際に送信されるデータではなく、サーバー上のリソースデータを一意に識別します。特定のURLリソースのETag
値が変更された場合、そのリソースのサーバー側データが変更されたことを意味します。