Cache-Controlの履歴

ブラウザにキャッシュ方法を指示するHTTPヘッダだが、よくわからない…。

詳しいまとめ。
http://www.ibm.com/developerworks/jp/web/library/wa-aj-cache...

どうやらこの4つは設定によって更新タイミングが変わるらしい。

  • URLの直打ち
  • リロード
  • リンク
  • 戻る



URLの直打ちや戻るでは更新せず、フォームをsubmitした時には更新が行われるのが理想…。

PHP

session_start()を使うと自動で色なヘッダ書き出してくる。デフォルトではno-cache。全くキャッシュが有効にならない。ヘッダを変更するには、session_startする前に、session_cache_limiter()する必要がある。

private_no_expire, max-age

自力で調べた結果、これが一番良い気がする。IEはまだ見てない。
フォームの入力が戻った時にも保持され、更新直後のキャッシュは残らない。

session_cache_limiter('private_no_expire, max-age=0');


If-Modified-Sinceのみ。ExpiresもCache-ControlもLast-modifiedも出力されない。
でも何故かうまく動作する。

If-Modified-Since: Sat, 20 Feb 2010 16:24:36 GMT

private_no_expire

session_cache_limiter('private_no_expire');


Cache-ControlとLast-Modifiedが出力
この方法が良いという記述をよく見かけた。確かにフォームのキャッシュは有効になるが、更新後にキャッシュがクリアされずに残る問題がある

Cache-Control: private, max-age=10800, pre-check=10800
Last-Modified: Sat, 20 Feb 2010 16:24:36 GMT

private

session_cache_limiter('private');


Expires、Cache-Control、Last-Modifiedが出力

Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: private, max-age=10800, pre-check=10800
Last-Modified: Sat, 20 Feb 2010 16:24:36 GMT

public

privateはプロキシサーバーでのキャッシュを無効し、publicは有効にする、と聞いたことがある。

session_cache_limiter('public');


If-Modified-Since、Expires、Cache-Control、Last-Modifiedが出力

If-Modified-Since: Sat, 20 Feb 2010 16:24:36 GMT

Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: public, max-age=10800
Last-Modified: Sat, 20 Feb 2010 16:24:36 GMT

private_no_expire, must-validate, max-age

session_cache_limiter('private_no_expire, must-validate, max-age=0');


If-Modified-SinceもExpiresもCache-ControlもLast-modifiedも出力されない。

no-cache

何も指定せずにsession_startを呼び出した場合。

If-Modified-Sinceはなく、no-cacheが付く。必ず更新する。

Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache

他のサイトはどうなってるか?

Firefox3.5.8で確認。

mixi

mixiはすべてno-cacheになってる。でも何故かフォームは保持してる。
HTMLで指定してるわけでもないし、JavaScriptも使っていない。どうやってるのか謎。
と思ったら、ホームなどはno-cacheだが、日記作成のところだけレスポンスコードの前にCache-Control: max-age=0が付加されていた。

Cache-Control: max-age=0

HTTP/1.1 200 OK
...
Cache-Control: no-cache
Pragma: no-cache

OpenPNE3

やはりmixiと同じで日記作成のところで Cache-Control: max-age=0 している。

アメブロ

戻ったら消えました

lang-8

Cache-Control: max-age=0
...
Cache-Control: private, max-age=0, must-revalidate

他のサイトとは逆で、日記を書くには最初のmax-ageはなかった。でも正しく動いているみたい。

はてなダイアリー

特にキャッシュ関係のヘッダはなし。
しかし、何故かタイトルを残して文が消えました。
JavaScriptも関係している?

Livedoor Blog

ブログを書くで戻って進でも残っている。
ブログを書くのみmax-ageが付加。

Cache-Control: max-age=0

Pragma: no-cache
Cache-Control: private

twitter

戻って進だら消えました

Pragma: no-cache
Cache-Control: no-cache, no-store, must-revalidate, pre-check=0, post-check=0
Expires: Tue, 31 Mar 1981 05:00:00 GMT

最後に一言

Operaならどなサイトでもフォームの情報は消えることがないので、困ってる人は使って下さい。