34

私はApacheを介してすべてのコンテンツを提供していますContent-Encoding: zipが、それはその場で圧縮されます。私のコンテンツの多くは、ディスク上の静的ファイルです。要求されるたびにファイルを圧縮するのではなく、事前にファイルを gzip したい。

これはmod_gzip、Apache 1.x で自動的に行われたことだと思いますが、.gz を含むファイルが隣にあるだけです。の場合はそうではなくなりましたmod_deflate

4

8 に答える 8

13

いずれにせよ、この機能は mod_gzip では見当違いでした。Apache 2.x では、コンテンツ ネゴシエーションを使用してこれを行います。具体的には、ディレクティブで有効にする必要がありMultiViewsOptionsディレクティブAddEncodingエンコーディング タイプを指定する必要があります。

于 2008-09-16T18:53:16.897 に答える
8

自分の構成に欠けていた非常に単純な行で自分の質問に答えるには:

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
于 2008-09-18T21:25:54.033 に答える
5

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 ルールを作成できると思います。

于 2012-02-07T00:15:21.383 に答える
5

mod_negotiation少し面倒ですが、を使用して事前に圧縮されたファイルを提供することは可能です。主な問題は、存在しないファイルに対する要求のみがネゴシエートされることです。したがって、foo.jsfoo.js.gzの両方が存在する場合、 の応答/foo.jsは常に圧縮されません (ただし、 の応答は/foo正しく機能します)。

私が見つけた最も簡単な解決策 ( François Marier から) は、圧縮されていないファイルの名前を二重のファイル拡張子に変更することです。そのため、(エンコードなし) と(gzip エンコード)の間でネゴシエートを要求するようfoo.jsに展開されます。foo.js.js/foo.jsfoo.js.jsfoo.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>

この構成の理由といくつかの代替案について詳しく説明する投稿を書きました。

于 2016-01-21T18:54:21.213 に答える
1

mod_gzipで圧縮されたコンテンツもその場で。実際にサーバーにログインし、シェルから実行することで、ファイルを事前に圧縮できます。

cd /var/www/.../data/
for file in *; do
    gzip -c $file > $file.gz;
done;
于 2008-09-16T18:59:48.253 に答える
0

大きな .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>

短くてシンプル:)

于 2014-08-28T19:30:59.050 に答える
0

を使用mod_cacheして、メモリ内またはディスク上のローカル コンテンツをプロキシできます。これが で期待どおりに機能するかどうかはわかりませんmod_deflate

于 2008-09-16T18:55:52.147 に答える