Ajax.RequestでGETメソッドを使うとき

基本的にGETメソッドでリクエストする際には、そのURLに含めるパラメータが同一であれば結果も同一であるという条件のもとに使うものです。なのでGETメソッドでリクエストすると基本的にはその結果がキャッシュされてしまいます。そんで何が起こったかというと、Ajaxな感じでへぇボタンとか作ってボタンを連打すると非同期でデータを送信して結果を画面に反映させるとかそんなん作って遊んでたんですけど、なぜかIEで実行すると2回目以降のリクエストが出来ず、キャッシュが働いてしまっている模様。

Msxml2.XMLHTTPかMicrosoft.XMLHTTPのどっちかがキャッシュするようになっているらしい。XMLHttpRequestだとうまくいくのでどうやらキャッシュ機能が無いようです。今回の場合、キャッシュが働くと不都合が起こるので3つの解決方法。1つはPOSTメソッドで送る。これはちょっとアレな解決方法なのでお勧めできず。2つ目はサーバ側のプログラムでHTTP/1.1に対応しているアプリケーションならば "Cache-Control: no-cache" をヘッダで出力させる、もし HTTP/1.0 アプリケーションのほうなら "Pragma: no-cache" をヘッダで出力すればキャッシュされずに済みます。PHPなら


// HTTP/1.1
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);

// HTTP/1.0
header("Pragma: no-cache");

そして3つ目の方法はGETメソッドに条件を付けることです。具体的には If-Modified-Since リクエストヘッダフィールドを加えてリクエストします。もしリクエストされた対象がこのフィールドで指定された日時以降に更新されていなければ、サーバは 304 (not modified) レスポンスを返します。ここで指定する日時を 01 Jan 1970 00:00:00 GMT に指定することで確実に "更新有り" とさせることができます。


var httpObj = new Ajax.Request(url,
{ method: 'get', onComplete: displayData,
requestHeaders: ['If-Modified-Since', '01 Jan 1970 00:00:00 GMT']
});

こんな感じです。