ApacheのMultiViewsで拡張子が有るリクエストでもgzが働くようにする

タイトルが呪文のようになっていますが、これ以上わかりやすいタイトルは思いつきませんでした。結局何の話かというと、Apacheのコンテントネゴシエーション(Content Negotiaion)機能、つまりHTTPサーバが持つコンテンツの中でクライアントに対して最適なコンテンツを自動的に選択して応答する機能についてです。

ことの発端は、prototype.jsでAjaxでも利用して少しサイトを華やかしようかと思った時でした。しかしこのprototyp.js、JavaScriptのくせに70KByteもサイズがあります(Ver.1.5.0)。これは少し嫌だなと思い調べてみたところ、gzip圧縮をかけてサイズを減らす方法があることを知りました。

この過程においてApacheのコンテントネゴシエーションの機能を知りました。つまり具体的にはMultiViewsというOptionを設定しておくことによって、prototype.jsを要求された際、クライアントがgzip圧縮をサポートしている場合はgzip圧縮されたprototype.js.gzを、そうでない場合は非圧縮のprototype.jsを返すということが可能なようです。しかしながらこれを実現するためには、デフォルトの設定では要求されるファイル、すなわちここではprototype.jsが存在しないことが必須条件(Apacheのマニュアルのコンテントネゴシエーション::MultiViews)であり、そのために多くの方は以下のどちらかの方法をとっていることがわかりました。

  • 要求するファイルはprototype.jsのままで、mod_rewriteの機能を利用してprototype.jsが存在していてもなんとかする
  • 要求するファイルを拡張子無しのprototypeにして、あとはサーバにまかせる

しかし残念ながらApacheのコンパイルでmod_rewriteを有効にしていなかったので、1番目の方法はできれば避けたいです。かといって、2番目の方法を採用しても、今までリンクは拡張子ありで記述していることがほとんどであったので、別のファイルにこの方法を適用する際に拡張子を削る作業に追われるのは目に見えています。そこで今回の本題である、なんとか拡張子が付いている状態であってもコンテンツネゴシエーションが働くようにしたい、という要望がでてきました。

解決策はとても単純でした。prototype.jsというファイル名をやめてprototype.js.jsにリネームします。こうすることで、prototype.jsに対する要求は、クライアントが圧縮に対応している場合はgzip圧縮のprototype.js.gzが、対応していない場合は非圧縮のprototype.js.jsが返るようになりました。
実はこれはApacheの1.3系のマニュアルに書いてありました。コンテントネゴシエーション::言語属性のない variantの部分で.html.htmlという例が紹介されています。

March 27, 2007 01:14 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク

コメント

コメントする