1. ホーム
  2. http

[解決済み] Transfer-Encoding: gzip vs. Content-Encoding: gzip

2022-11-13 10:14:54

質問

を行うかどうかの現状はどうなっているのでしょうか?

Transfer-Encoding: gzip

または

Content-Encoding: gzip

を許可したい場合 クライアント を許可したい場合。 圧縮された応答を受け入れる意志があることを示す とか サーバは圧縮するかどうかの最終決定権を持っています。 .

後者は、例えばApacheのmod_deflateやIISが圧縮を担当させた場合に行うものです。圧縮されるコンテンツのサイズに応じて、それは追加の Transfer-Encoding: chunked .

また、これには Vary: Accept-Encoding も含まれており、これはすでに問題のヒントになります。 Content-Encoding はエンティティの一部であるようなので Content-Encoding を変更することは、実体を変更すること、つまり、異なる Accept-Encoding ヘッダが異なるということは、例えば、キャッシュが、そうでなければ同一の実体のキャッシュされたバージョンを使用できないことを意味します。

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

私の現在の印象は

  • Transfer-Encoding は、既存のサーバーとクライアントの実装によって Content-Encoding でほとんど行われていることを行うための正しい方法でしょう。
  • Content-Encoding は、そのセマンティックな意味合いから、いくつかの問題を含んでいます。 ETag に対して何をすべきなのでしょうか?)
  • 理由は鶏と卵です: ブラウザがサポートしていないため、サーバーがサポートしていないため、ブラウザがサポートしていないためです。

というわけで、私は正しい方法は Transfer-Encoding: gzip (である(あるいは、ボディを追加でチャンクすると、それは Transfer-Encoding: gzip, chunked ). そして Vary または ETag などのヘッダは、トランスポートレベルのものです。

今のところ、私は「ホップバイホップ」であることをあまり気にしていません。 Transfer-Encoding の「ホップ バイ ホップ」については、プロキシは圧縮を解除してクライアントに転送するかもしれないので、他の人がまず第一に気にするようなことではありません。しかし、プロキシはそのまま (圧縮されたまま) 転送してもかまいませんし、もしオリジナルのリクエストに適切な Accept-Encoding ヘッダーがある場合、プロキシはそのまま (圧縮されたまま) 転送します。

この問題は少なくとも 10 年以上前のもので、たとえば次のようなものがあります。 https://bugzilla.mozilla.org/show_bug.cgi?id=68517 .

これに関するどんな明確な説明も感謝されます。何が標準準拠とみなされるか、そして何が実用的とみなされるかという点で、両方です。たとえば、HTTP クライアント ライブラリが透過的な "Content-Encoding" をサポートするだけでは、実用性に反する議論になります。

どのように解決するのですか?

引用元 ロイ・T・フィールディング RFC2616の著者の一人である。

content-encoding を一貫性のない方法でその場で変更することは ("never" or "always のどちらでもない)そのコンテンツに関する後の要求が不可能になります。 そのコンテンツに関する後のリクエスト (例: PUT や条件付き GET) を正しく処理することができなくなります。 を正しく処理することができなくなります。 もちろん、これがオンザフライの を実行するのが馬鹿げている理由であり、 正しい方法として HTTP に Transfer-Encoding を追加した理由でもあります。 を HTTP に追加したのは、リソースを変更せずにその場でエンコードするための適切な方法だからです。 を追加した理由です。

ソースは https://issues.apache.org/bugzilla/show_bug.cgi?id=39727#c31

つまりは をしないことです。 オンザフライ Content-Encoding を行わず、代わりに Transfer-Encoding を使ってください!

編集してください。 ということです。 を理解するクライアントにgzip形式のコンテンツを提供したい場合は別ですが、そうでない場合は、このようになります。 . これは、残念ながら、それらのほとんどであるように思われる。しかし、あなたは 仕様の領域から離れる で、Fielding が言及したような問題や、他の問題、たとえばキャッシュプロクシが関与している場合などに遭遇する可能性があることに注意してください。