■ Firefox でのローカルキャッシュと If-Modified-Since
ScrapMemo は静的 XML ファイルを扱ってるわけでして、そうなると、やっぱり更新時刻のチェックとかローカルキャッシュの事も考えないといけないわけなので、XMLHttpRequest と If-Modified-Since に書いてある事を参考にして処理を組み込んでみました。
で、apache のログを確認しながらちゃんと動くか見ていたのですが、IE では期待通りに動作してくれるんだけど、Firefox では稀にサーバへ全く何のリクエストも送信しなくなってしまう事があり、なんでだろうと調べてみたら、ローカルキャッシュの Expires の時刻を過ぎない場合はサーバへはアクセスしないでローカルキャッシュから読み込むと言う動作をしている事がわかりました。
しかも、どうやら Expires の時刻は、Last modified を元にして計算しているようで、あまり頻繁に更新されないファイルに関しては期間が長めになるようです。
普通は気にならないかもしれませんが、私はかなり神経質なので、自分でファイルを更新した事がわかっているのに、ローカルキャッシュから読み込むなんて許せません。動的なシステムなんだから、やっぱ更新はすぐ検知して欲しいものです。
こんな時 HTML ファイルだったら、META タグとか使って「キャッシュしないでね」とか言うヘッダを入れればいいのか?と思って、XML で同じように出来るかどうかを調べてみたんですが、全然わかりません。なかなかわかんなくて、いい加減ムカツイて来たので、.htaccess で Expires ヘッダの処理を制御する事にしました。
以下は、Apache2 で mod_expires を有効にして、ExpiresByType が使えるようになるまでの流れです。
まず、mod_expires を使えるようにします。多分標準のモジュールなので、a2enmod expires とやれば有効になります。
.htaccess で mod_expires のディレクティブが使えるようにします。apache2.conf とかどこかそこらへんで、AllowOverride に Indexes を追加します。
適当なディレクトリに .htaccess を設置します。Expires の値を Last Modified + 1時間に設定する場合はこんな感じ。書式については ドキュメント 参照。
ExpiresActive On ExpiresByType text/xml "modification plus 1 hours" ExpiresByType application/xml "modification plus 1 hours"
自分の所の localhost では、text/xml じゃなくて、application/xml だったので、両方指定してます(これで結構はまった)。
Expires の値を小さくすると、Firefox でも IE と同じように毎回サーバへリクエストを送信するようになりました。ちゃんと If-Modified-Since の処理をさせているので、ファイルが更新されていない場合は 304 ステータスで処理されるようです。
とりあえず確実に更新が検知出来るようになりましたが、こんなやり方をしても良いものなの?!
Posted by Kyosuke Takayama at 2005-05-12 (Thu) 15:00 printable version
○ ClearGreen: コメントが反映されないよ問題についての考察 (2006-03-16 (Thu) 02:14) 0%
Movable Typeのダイナミック・パブリッシングを使っているので、 動的生...