web-dev-qa-db-ja.com

Transfer-Encoding:gzipとContent-Encoding:gzip

行うかどうかに関しては、現状はどうなっていますか

Transfer-Encoding: gzip

または

Content-Encoding: gzip

たとえばclientsを許可したい場合帯域幅をに制限し、圧縮された応答を受け入れる意思があることを通知しますおよびサーバーは、圧縮するかどうかを最終決定権を持ちます

後者は、たとえばApacheのmod_deflateおよびIISは、圧縮を処理できるようにする場合に行います。圧縮するコンテンツのサイズに応じて、追加のTransfer-Encoding: chunkedを実行します。

また、Vary: Accept-Encodingも含まれます。これはすでに問題を示唆しています。 Content-Encodingはエンティティの一部のようです。したがって、Content-Encodingを変更すると、エンティティが変更されます。つまり、異なるAccept-Encodingヘッダーは、キャッシュは、他の点では同一のエンティティのキ​​ャッシュバージョンを使用できません。

これについて私が見逃した明確な答えはありますか(そしてそれはいくつかのApacheニュースグループの長いスレッドのメッセージの中に埋もれていません)?

私の現在の印象は:

  • 実際、Transfer-Encodingは、既存のサーバーとクライアントの実装によってContent-Encodingでほとんど行われていることを行う正しい方法です
  • Content-Encodingには、その意味的な意味があるため、いくつかの問題があります(応答を透過的に圧縮する場合、サーバーはETagに対して何をすべきでしょうか?)
  • その理由は、chicken'n'Egg:ブラウザがサポートしていないためサーバーがサポートしていないため、ブラウザがサポートしていないからです。

したがって、正しい方法はTransfer-Encoding: gzip(または、さらに本文をチャンクすると、それは になるTransfer-Encoding: gzip, chunked)になると想定しています。 VaryETag、またはその場合は他のヘッダーに触れる理由はありません。これはトランスポートレベルのものです。

現時点では、Transfer-Encodingの「ホップバイホップ」性についてはあまり気にしません。他の人が何よりも懸念しているように見えることです。ただし、元のリクエストに適切なAccept-Encodingヘッダーが含まれている場合、プロキシはそのまま(圧縮)転送します。これは、私が知っているすべてのブラウザーの場合に与えられます。

ところで、この問題は少なくとも10年前のものです。 https://bugzilla.mozilla.org/show_bug.cgi?id=68517 .

これについての説明は歓迎します。標準準拠と見なされるものと実用的と見なされるものの両方の点で。たとえば、透過的な「Content-Encoding」のみをサポートするHTTPクライアントライブラリは、実用性に反する議論になります。

88

引用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のみを理解するクライアントに提供したい場合を除きます。残念ながら、それらのほとんどがそうです。しかし、あなたは仕様の領域を離れて、フィールディングや他の人が言及したような問題に遭遇する可能性があることに注意してください、例えばキャッシュプロキシが含まれる場合。

33

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値が変更された場合、そのリソースのサーバー側データが変更されたことを意味します。

26
Remy Lebeau