mod_rewriteでURIを書き換えるとローカルキャッシュがきかない

昨日の続き。static.hogehoge.comのCNAMEレコードがだいたい行き渡ったようなので、昨日の設定を有効化。どういうことをやったかをおさらいすると、

という三つの条件を満たすリクエストがきた場合にリクエストされたホスト名を書き換えて別のバーチャルホストで処理するというもの。

http://www.hogehoge.com/images/logo.gif
というリクエストをサーバでうけて、
http://images.hogehoge.com/images.logo.gif
で処理してコンテンツをクライアントに返す。

有効にしたところ確かにZope側(www.hogehoge.comからProxyされるバックエンド)へくるリクエストは減少したものの、ウェブブラウザからアクセスしてみるとなんだか「もっさり」した感じ。
一番おかしいところは、JavaScriptで制御しているマウスオーバしたときの画像切り替え。こんなのは一度アクセスするとブラウザ側にたまっているローカルキャッシュを参照するはずなんですが、YSlowでモニタすると毎度毎度サーバへ画像をとりに行っている。どうもおかしい。FirefoxのAdonでブラウザにたまっているキャッシュの一覧を参照できるCacheViewerってのがあるのでそれをいれてチェックすると、CSSから参照されている画像以外は一切ブラウザにキャッシュされていないことがわかりました。

クライアント(ブラウザ)は http://www.hogehoge.com/images/logo.gif というリクエストをなげているのに対して、サーバは http://images.hogehoge.com/image/logo.gifというURIでExpireヘッダをつけて返しています。よって、クライアント側では http://images.hogehoge.com/image/logo.gif はキャッシュしますが、http://www.hogehoge.com/images/logo.gifはキャッシュしないようです。CSSから参照されている画像は最初から images.hogehoge.com というURIでリクエストを投げています。CSSJavaScriptも画像へのリンクは相対パス(images/logo.gif)としか書いていませんが、この挙動の違いはまあそんなもんなんでしょう。

さてどうするか

さてどうしましょう。
ドメインでサービスするのを諦めるってのが一番コストが安い、けどやっぱりバックエンドの負荷は下げたいですねぇ。yahoo.co.jpやgoogle.com,amazon.co.jpあたりのページソースをのぞいてみると、CSSJavaScript,画像へのリンクは別ドメイン名で絶対パスで書いてありますね。そうしてもらおうかな。