Apache で gzip 圧縮されたファイルの返し方(prototype.js での作業

やっぱり、prototype.js って巨大ですよね。
なんとか小さくしたい!

世間では、どうもgzip 圧縮する方法があるようです。

http://d.hatena.ne.jp/odz/20061118/1163922742

を参考に、自分でもやってみた。

本記事は、上で紹介されているmod_rewrite での方法を行ってみた時の作業メモです。
自分がハマッたり、理解不足で必要かどうか分からなかった部分について結論をまとめてみました。
ですので先ずは上の記事(やそこからリンクされているページ)の内容を読んでください。


(1)Content Negotiaion (MultiViews) は必要?
→必要ありません。mod_rewrite だけで行けます。

(2)RewriteCond の-s 演算子では、サーバーのルートからのパスを渡す必要アリ!!
→はまりどころなので注意!
→(mod_rewrite のログを書き出すようにしたら、この手の問題が切り分けるヒントが得られます)

(3)ContentEncoding を指定するためには、mod_mime でAddEncoding する必要アリ

(4)Content-Type にapplication/x-javascript とさせるために、次のようにしてみた

AddType application/x-javascript .gz

この設定をしないと、単なる拡張子がgzip のファイルとして認識され、javascript として動いてくれない!
今回ココにもハマッタので注意。

*ただし*
この設定では、.gz ファイルが問答無用でjavascript として扱われるので、この仕組みでjs 以外のファイルをgzip 圧縮して軽くしたい場合はNGですので気をつけてください。


結局、以下の行をhttpd.conf に追加したことになりました。

# (3)の設定はこれ

AddEncoding x-gzip .gz .tgz

# (4)の設定はこれ

AddType application/x-javascript .gz

# 適宜の場所に設置


RewriteEngine on
RewriteLog "logs/rewrite_log"
RewriteLogLevel 0

# gzip compless (for prototype.js.gz)
RewriteCond %{HTTP:Accept-Encoding} gzip
RewriteCond %{REQUEST_FILENAME} !\.gz$
RewriteCond /var/www/html/web%{REQUEST_FILENAME}\.gz -s
RewriteRule .+ %{REQUEST_URI}.gz