Web サーバーのすべての静的ファイルをローカルで圧縮しておき、要求に応じて圧縮または非圧縮で提供したいと考えています。
How can I pre-compress files with mod_deflate in Apache 2.x?の回答 実際、MultiViews を有効にし、適切な AddEncoding を使用することで、Apache がfoo.tar.gz
を要求したときに Web サーバーから圧縮ファイルを返してくれるので、適切なヘッダーfoo.tar
が付属しています。Content-Encoding:
ただし、これは、クライアントがAccept-Encoding: gzip
サーバーに送信するヘッダーに含まれている場合にのみ機能します。OTOH クライアントが gzip エンコーディングをサポートしていない場合、サーバーは「受け入れられる」ものがないことを通知しfoo.tar
ます。
を使用すれば、送信する前に Apache にその tarball を解凍させることができますAddOutputFilter INFLATE tar
。しかし、それを行うと、サーバーは要求時にfoo.tar.gz
(または gzip エンコーディングを受け入れるように指定したときに) コンテンツも解凍しますが、これは明らかに望ましくありません。
では、クライアントが gzip content-encoding をサポートしていない場合に Apache にファイルを解凍させ、それ以外の場合には圧縮前のファイルを提供させるにはどうすればよいでしょうか?
編集: @covener の提案に基づいて、次のことを試しました。
AddEncoding x-gzip .gz .tgz
RemoveType application/x-gzip .gz .tgz
AddType application/x-tar .tgz
<Location /packages>
FilterDeclare smgunzip CONTENT_SET
FilterProvider smgunzip INFLATE req=Accept-Encoding !$gzip
FilterChain smgunzip
</Location>
[ ここでは Apache-2.2.22 を使用。] しかし、結果は実際には最初の 3 行だけよりも悪くなります: .tar.gz ファイルを要求すると、"Content-Encoding:" なしで返され、.tar ファイルを要求すると、 「Accept-Encoding:」ヘッダーに関係なく、「Content-Encoding:」がなくても、tar.gz のコンテンツ (つまり、まだ圧縮されている)。