私はApacheを介してすべてのコンテンツを提供していますContent-Encoding: zip
が、それはその場で圧縮されます。私のコンテンツの多くは、ディスク上の静的ファイルです。要求されるたびにファイルを圧縮するのではなく、事前にファイルを gzip したい。
これはmod_gzip
、Apache 1.x で自動的に行われたことだと思いますが、.gz を含むファイルが隣にあるだけです。の場合はそうではなくなりましたmod_deflate
。
私はApacheを介してすべてのコンテンツを提供していますContent-Encoding: zip
が、それはその場で圧縮されます。私のコンテンツの多くは、ディスク上の静的ファイルです。要求されるたびにファイルを圧縮するのではなく、事前にファイルを gzip したい。
これはmod_gzip
、Apache 1.x で自動的に行われたことだと思いますが、.gz を含むファイルが隣にあるだけです。の場合はそうではなくなりましたmod_deflate
。
いずれにせよ、この機能は mod_gzip では見当違いでした。Apache 2.x では、コンテンツ ネゴシエーションを使用してこれを行います。具体的には、ディレクティブで有効にする必要がありMultiViews
、Options
ディレクティブAddEncoding
でエンコーディング タイプを指定する必要があります。
自分の構成に欠けていた非常に単純な行で自分の質問に答えるには:
Options FollowSymLinks MultiViews
MultiViews オプションがありませんでした。これは Ubuntu のデフォルトの Web サーバー構成に含まれているため、私のようにドロップしないでください。
また、すべてのファイルを圧縮する簡単な Rake タスクを作成しました。
namespace :static do
desc "Gzip compress the static content so Apache doesn't need to do it on-the-fly."
task :compress do
puts "Gzipping js, html and css files."
Dir.glob("#{RAILS_ROOT}/public/**/*.{js,html,css}") do |file|
system "gzip -c -9 #{file} > #{file}.gz"
end
end
end
MultiViews は期待どおりに動作しないのではないかと心配しています: ドキュメントによると、Multiviews は「サーバーが /some/dir/foo のリクエストを受信した場合、/some/dir で MultiViews が有効になっており、/some/dir/foo が存在しない場合に動作します。 ..」、つまり、同じディレクトリにファイル foo.js と foo.js.gz がある場合、MultiViews を有効にするだけでは、AcceptEncoding gzip ヘッダーがブラウザ (一時的に mod_deflate を無効にし、HTTPFox などで応答を監視することで、この動作を確認できます)。
MultiViews でこれを回避する方法があるかどうかはわかりませんが (元のファイルの名前を変更してから、特別な AddEncoding ディレクティブを追加できるかもしれません)、これを処理する mod_rewrite ルールを作成できると思います。
mod_negotiation
少し面倒ですが、を使用して事前に圧縮されたファイルを提供することは可能です。主な問題は、存在しないファイルに対する要求のみがネゴシエートされることです。したがって、foo.js
とfoo.js.gz
の両方が存在する場合、 の応答/foo.js
は常に圧縮されません (ただし、 の応答は/foo
正しく機能します)。
私が見つけた最も簡単な解決策 ( François Marier から) は、圧縮されていないファイルの名前を二重のファイル拡張子に変更することです。そのため、(エンコードなし) と(gzip エンコード)の間でネゴシエートを要求するようfoo.js
に展開されます。foo.js.js
/foo.js
foo.js.js
foo.js.gz
そのトリックを次の構成と組み合わせます。
Options +MultiViews
RemoveType .gz
AddEncoding gzip .gz
# Send .tar.gz without Content-Encoding: gzip
<FilesMatch ".+\.tar\.gz$">
RemoveEncoding .gz
# Note: Can use application/x-gzip for backwards-compatibility
AddType application/gzip .gz
</FilesMatch>
この構成の理由といくつかの代替案について詳しく説明する投稿を書きました。
mod_gzipで圧縮されたコンテンツもその場で。実際にサーバーにログインし、シェルから実行することで、ファイルを事前に圧縮できます。
cd /var/www/.../data/
for file in *; do
gzip -c $file > $file.gz;
done;
大きな .json ファイルがたくさんあります。ほとんどの読者はこの状況にあります。プレビューの回答では、返された「Content-type」については言及されていませんでした。
次のリクエストで、"Content-Type: application/json" の事前圧縮ファイルを透過的に返したい場合は、ForceType で Multiview を使用します
http://www.domain.com/(...)/bigfile.json
-> Content-Encoding:gzip, Content-Type: Content-Encoding:gzip
1) ファイルの名前を変更する必要があります: "file.ext.ext"
2) マルチビューは ForceType でうまく機能します
ファイルシステムで:
// Note there is no bigfile.json
(...)/bigfile.json.gz
(...)/bigfile.json.json
あなたのApache設定で:
<Directory (...)>
AddEncoding gzip .gz
Options +Multiviews
<Files *.json.gz>
ForceType application/json
</Files>
</Directory>
短くてシンプル:)
を使用mod_cache
して、メモリ内またはディスク上のローカル コンテンツをプロキシできます。これが で期待どおりに機能するかどうかはわかりませんmod_deflate
。