圧縮されたPOSTデータをJavascriptで制御するサーバーに送信します。HTTPレイヤーに圧縮を処理させる方法はありますか。
JSONを送信しています。コンテンツタイプをGZIP/deflateに設定すると、ブラウザーは自動的に圧縮し、次にdeflate modを使用したApacheは自動的に圧縮解除されるので、アプリケーションはデータがまったく圧縮されていることを考慮する必要はありませんか?
私はそれが他の方法で動作することを知っていますが、それをこのように動作させる方法はありますか?
ブラウザはデータを自動的にgzipエンコードしますか?短い答えはノーです。
長い答えは、一部のユーザーエージェントはこのようなことを行うことができるが、あなたは明確にそれに頼ることができないということです。 Apache mod_deflateドキュメントの状態:
webDAVクライアントなど、一部の特別なアプリケーションは実際にリクエストの圧縮をサポートしています。
だから、いや、それは動作しません。適切なHTTP要求メッセージを自分で生成する必要があります。この場合の適切なヘッダーはContent-Encoding: gzip
であり、Content-Type:
ではありません。コンテンツ自体がapplication/json
であるため、HTTPリクエストメッセージのエンティティ本体を転送用にエンコードするだけです。
圧縮後にメッセージエンティティ本体のバイト単位のサイズを指定する適切なContent-Length:
ヘッダーも追加する必要があることに注意してください。または、Transfer-Encoding: chunked
を使用してHTTPメッセージを送信し、content-length仕様を無視してください。
受信側で、canmod_deflate
に入力フィルターを使用するように指示する 情報を解凍します。
<Location /dav-area>
SetInputFilter DEFLATE
</Location>
圧縮されたメッセージ本文を2、3のリソースだけで受信している場合、これは少し重いです。代わりに、おそらくクライアント側のスクリプトを使用してContent-Encoding: gzip
ヘッダーを確認し、リクエスト本文を手動で解凍する必要があります。たとえば、PHPでこれを行う方法は、まったく別の問題です。詳細が必要な場合は、別の質問を投稿してください。
可能ですが、サーバーに着信するgzip圧縮されたデータの受け入れを強くお勧めします。主な理由は、サーバーが gzip bombed にならないようにすることです。一般に、実際にデータを圧縮解除する前に、圧縮されていないデータがどのように見えるかを知ることはできないため、ユーザーは無害な1 KBまたは1 MBのデータのように見えるが、実際には100 GBのデータであるWeb要求を送信できます。サーバー(nginxまたはApache)は、すべてを解凍しようとして次の10分間ハングアップし、最終的にメモリ不足/ロックアップを引き起こします。
https://github.com/dankogai/js-deflate を使用してこれを実現しましたが、何らかの理由でポストデータが+記号を削除し、スペースで置き換えます。
JavaScriptを介してデータを送信するには:
params.mapdata= btoa(RawDeflate.deflate(JSON.stringify(mapdata)));
Php経由でデータを受信するには:
$value = gzinflate(base64_decode(preg_replace('/\s/', '+',$value)));