読者です 読者をやめる 読者になる 読者になる

【続き】XMLHttpRequestによるステータスコード304の取り扱い

http://labs.cybozu.co.jp/blog/kazuho/archives/2006/02/utilizing_cache.php
http://www.semblog.org/msano/archives/000386.html
などを参考にいろいろ試したが、やっぱり以下の結論になった。


1.Expiresレスポンスヘッダによるローカルキャッシュの利用
2.If-Modified-Sinceリクエストヘッダによるサーバーキャッシュの利用
の2段階のキャッシュ利用をしようと思ったがあきらめた。

1.のキャッシュは前回記事の通りXMLHttpRequest.statusが常に200になってしまう問題があるためローカルキャッシュとフレッシュデータの判別ができないため振る舞いを変えられない。
2.のキャッシュは自前でIf-Modified-SinceヘッダをXMLHttpRequestにセットしてリクエストを投げればXMLHttpRequest.statusが304で受け取れたが、このヘッダをセットすると常にサーバーに問い合わせにいってしまう(Expiresが効かない)


前回記事の

サーバー>>>ブラウザ>>>XMLHttpRequestエンジン
という順番で通知されるということが解説されていて、ブラウザが304を受け取った時点でブラウザキャッシュをセットしてXMLHttpRequestエンジンには200として通知している

の論理に従えば、XMLHttpRequestオブジェクトのヘッダに何もセットしなければ、ブラウザレベルでヘッダをセットしてリクエスト処理してくれる。
実際Apacheログでは適切なステータスコードを返しているし。
(Expires期限内はアクセスしない、Expires期限過ぎて対象リソースに修正なし→304、Expires期限過ぎて対象リソース修正あり→200)


しかし、XMLHttpRequestオブジェクトレベルでヘッダをセットすると、リクエスト時にはそのヘッダを利用するためブラウザレベルではヘッダのセットを行わない。
なので、ExpiresもIf-Modified-Sinceもセットされない。
(前述の1.のパターンのように明示的にセットする手もあるけど、ExpiresやLast-Modifiedの日時をグローバルオブジェクトかなんかで保持しておかないといけない。


Ajaxを駆使した画面を作るとなるとアクセスするリソース毎にすべて保持しておかないといけないため面倒。
これなんとかならんかな。