ブラウザが gzip リクエストを送信できないのはなぜですか?
質問
Webサーバーがgzipレスポンスを送信できるのに、ブラウザはなぜgzipリクエストを送信できないのでしょうか?
解決
クライアントとサーバーは、通信方法について同意する必要があります。その一部は、通信を圧縮できるかどうかです。 HTTPは要求/応答モデルとして設計されており、元の作成はほとんど確実に、常に小さな要求と潜在的に大きな応答を持つように想定されていました。 HTTPを実装するために圧縮は必要ではありません。それをサポートしないサーバーとクライアントの両方があります。
HTTP圧縮は、クライアントが圧縮をサポートできると実装しており、サーバーが要求でこれを認識し、圧縮をサポートしている場合、応答を圧縮できます。リクエストを圧縮するには、クライアントに「事前リクエスト」が必要です。リクエストが圧縮されるか、すべてのリクエストでサポートされるエンコードとして圧縮を要求する必要があることを実際にネゴシエートしました。
* 17年2月更新* 8年が経過しましたが、@ Phil_1984_が述べているように、3番目の解決策は、クライアントとサーバーが圧縮サポートをネゴシエートし、その後の要求に使用することです。実際、HSTSのようなものは、サーバーがTLSのみを話し、暗号化されていないリンクを無視することを想定しているクライアントキャッシングでこのように機能します。 HTTPはステートレスになるように明示的に設計されましたが、この時点でそれを超えて移動しました。
他のヒント
クライアントは、サーバーがgzip圧縮された要求を理解することを事前に知ることはできませんが、サーバーはクライアントが要求を受け入れることを知ることができます。
サーバーがそれを受け入れることを保証できれば可能です。これは、OPTIONSリクエストの使用を意味する場合があります。
Webブラウザでできること(パイプライン処理など)にはできないことがたくさんあります。 Webブラウザ開発者は、変更が互換性に与える影響を考慮します。
異種環境では、さまざまなWebサーバーと構成があります。クライアントの作業方法を変更すると、それらの一部が壊れる可能性があります。
gzip圧縮されたリクエストを受け入れるのはおそらく1%のサーバーだけかもしれませんが、一部のサーバーは承認したことを宣伝しますが、正しく受け入れられないため、ユーザーはそれらのサイトへのファイルのアップロードを拒否されます。
これまで、多くのクライアント/サーバーの実装が壊れていました-長い間、主要なWebブラウザでgzip圧縮された応答が壊れていました(ありがたいことに、それらはほとんどなくなっています)。
そのため、これらのオプションが自動的にオフになっているユーザーエージェントまたはサーバー(またはドメイン名)のブラックリストになってしまいます。これは厄介です。
サーバーがそれを受け入れることができることを知らないため。 HTTPトランザクションには、クライアントが送信した単一の要求とそれに続く応答があります。クライアントが送信するものの1つは、サポートできるエンコード/圧縮です。サーバーは、応答の圧縮方法を決定できます。クライアントにはこの贅沢はありません。
Webアプリケーションを作成している場合、クライアントに送信されるものとクライアントから返されるものを制御できると想定しています。
サーバーに送信される投稿データを圧縮するgzip実装をjavascriptで記述するのは簡単です。サーバーには、クライアントデータが圧縮されて送信されることがわかっているフィルター(j2ee用語)があり、このフィルターはデータを圧縮解除してから、通常のようにデータを読み取るサーブレット(またはStrutsのアクションクラス)にデータを渡します。 request.getParameter(...)。
これは完全に論理的で、あなたが管理している場合は実行可能です。他の投稿が言及しているように、ブラウザにこれを自動的に行わせることはできませんでしたが、Webページを書いているので、ブラウザに目的の圧縮を実行させることができます(わずかな作業で)。
アンディ。
HTTP は次のように設計されています。
- クライアントはリクエストをプレーンテキストで発言します (圧縮された回答を理解できるかどうかを含む)
- サーバーは適切なエンコーディング (圧縮されているかどうかにかかわらず) で応答します。
しかし、この設計では、サーバーが事前にそれを理解するかどうかがわからないため、クライアントは圧縮されたリクエストを送信できません。