22

基本的に .html と .data ファイルで構成される JavaScript ゲームをホストしています。gzip で圧縮すると、サイズが 25% に縮小されます。だからやりたい。

100% 確信があるわけではありませんが、mod_gzip または mod_deflate を使用するとオンザフライで圧縮が行われ、コンテンツが変更されないため、常に CPU 時間が浪費されると思います。

そのため、コンテンツをプリコンパイルしたいと思います。したがって、圧縮されていないファイルの横に .gz を配置し、書き換えルールを .htaccess に配置します。

RewriteEngine on 
# If client accepts compressed files 
RewriteCond %{HTTP:Accept-Encoding} gzip 
# and if compressed file exists 
RewriteCond %{REQUEST_FILENAME}.gz -f 
# send .html.gz instead of .html 
RewriteRule ^(.+)\.(html|css|js|data)$ $1.$2.gz [T=text/$2,E=GZIP:gzip,L] 
Header set Content-Encoding gzip env=GZIP 

リダイレクトは機能しています。game.html をリクエストして、実際に game.html.gz を配信できます。ただし、ブラウザは表示するだけではありません。代わりに、ファイルを保存する場所を尋ねられます。どうすれば修正できますか?それとも、私の目標を達成する別の方法がありますか?

4

4 に答える 4

19

これは、同じ問題を一度修正した方法です。

.htaccess に新しいタイプを追加します。

AddEncoding gzip .jsgz .cssgz .htmlgz .datagz
AddType application/javascript .jsgz
AddType text/css .cssgz
AddType text/html .htmlgz       
AddType text/plain .datagz

これは、AddType命令が .html.gz 形式の拡張子を受け入れないため、このように行われました。

次に、書き換えルールを変更します。

RewriteRule ^(.+)\.(html|css|js|data)$ $1.$2gz [L] 

最後に、ファイルの名前を変更します。.html.gz、.js.gz などからドットを削除します。

完全な .htaccess は次のようになります。

AddEncoding gzip .jsgz .cssgz .htmlgz .datagz
AddType application/x-javascript .jsgz
AddType text/css .cssgz
AddType text/html .htmlgz       
AddType text/plain .datagz

RewriteEngine on 
# If client accepts compressed files 
RewriteCond %{HTTP:Accept-Encoding} gzip 
# and if compressed file exists 
RewriteCond %{REQUEST_FILENAME}gz -f 
# send .html.gz instead of .html 
RewriteRule ^(.+)\.(html|css|js|data)$ $1.$2gz [L] 
于 2013-06-02T14:15:32.563 に答える
10

自問すべき最初の質問は、これを行うことに何か意味があるかということです。これにより、CPU 負荷が高すぎることやパフォーマンスの違いに気付きましたか? 私の推測では、おそらくこの問題に遭遇していないでしょう:)

とにかく、問題を解決する方法は複数あります。

  1. おそらくあなたにとって最良のオプションは、CDN を使用することです。それらは静的ファイルの高速配信用に設計されており、サーバーの近くにいる人だけでなく、地理的に異なる地域にいる人にも高速になります. また、私の経験では、CDN は通常、自分の帯域幅よりもはるかに安価です。

  2. Nginx を使用します。静的ファイルのホスティングがはるかに高速で、現在行っているような静的コンテンツの事前生成がサポートされています。ファイルがあるかどうかを自動的に検出.gzし、必要に応じて代わりに提供します。

  3. mod_mem_cacheまたはのような Apache キャッシュ メカニズムのいずれかmod_disk_cacheを使用して、定期的に使用されるすべてのファイルがキャッシュに保存されるようにします。チュートリアル: http://webdirect.no/linux/apache-caching-with-gzip-enabled/

  4. その前に Varnish のようなキャッシング プロキシを使用します。これらのタイプのサーバーは、よりスマートなキャッシング メカニズムを備えており、最も重要なファイルを実際にキャッシュします。

ただし、現在のバージョンでは、次のようなもの(テストされていません)でうまくいくはずです:

RewriteEngine On    
RewriteCond %{HTTP:Accept-encoding} gzip
RewriteCond %{REQUEST_FILENAME}\.gz -s
RewriteRule ^(.*)\.(html|css|js|data) $1\.$2\.gz [QSA]

# Prevent double gzip and give the correct mime-type
RewriteRule \.css\.gz$ - [T=text/css,E=no-gzip:1,E=FORCE_GZIP]
RewriteRule \.js\.gz$ - [T=text/javascript,E=no-gzip:1,E=FORCE_GZIP]
RewriteRule \.html\.gz$ - [T=text/html,E=no-gzip:1,E=FORCE_GZIP]
RewriteRule \.data\.gz$ - [T=text/plain,E=no-gzip:1,E=FORCE_GZIP]

Header set Content-Encoding gzip env=FORCE_GZIP
于 2013-06-02T14:03:31.517 に答える
7

受け入れられた答えはかなり痛いようです。 Wolph の回答の方が優れているように見えますが、ファイル拡張子ごとに個別の構成が必要であり、より高度なネゴシエーション ( q-valuesstatus 406TCNなど) のサポートが不足しています。を使用してコンテンツ ネゴシエーションを自分で実装するのではなく、この質問で説明されているようにmod_rewrite使用を検討することをお勧めします。そこから私の答えをコピーします:mod_negotiation

Options +MultiViews
RemoveType .gz
AddEncoding gzip .gz
<FilesMatch ".+\.tar\.gz$">
    RemoveEncoding .gz
    # Note:  Can use application/x-gzip for backwards-compatibility
    AddType application/gzip .gz
</FilesMatch>

.gzこれには、明示的に構成されたファイルだけでなく、すべてのファイルで機能し、 brotliやその他のエンコーディング用に簡単に拡張できるという追加のボーナスがあります。

存在しないファイルに対するリクエストのみがネゴシエートされるため、 という名前のファイルfoo.jsは に対してリクエストを行いますが、圧縮されていないバージョンを返します/foo.js。これは、圧縮されていないファイルの名前を二重の拡張子に変更するFrançois Marier のソリューション/fooを使用して回避できるため、として展開されます。foo.jsfoo.js.js

于 2016-01-21T19:12:43.477 に答える
3

ここで概説されているソリューションについてはどうですか: http://feeding.cloud.geek.nz/posts/serving-pre-compressed-files-using/ . Apache の組み込み MultiViews を使用します...

于 2014-02-14T23:29:16.080 に答える