« 中国の「段ボール肉まん」は「やらせ」でした | トップページ | 帝国ホテルのお味は? »

2007年7月19日 (木)

PHPのsession_cache_limiterで"private, must-revalidate"の指定は間違ってる

PHP/「ページの有効期限切れ」対策

↑のページを読んで長年の疑問が氷解しました・・・。

Web系アプリの作成で頭の痛い「ページの有効期限切れ」の対策ですが、検索すると「session_cache_limiterに"private, must-revalidate"を指定すると良いよ」ってな話が結構出てきますが、これは間違ってます。

詳しい内容は上記のリンク内に書かれてますが、session_cache_limiterの引数はnone/nocache/private/private_no_expire/publicのいずれかの値しか受け付けません。
その他の値をセットすると無効扱いされて、noneを指定した場合と同じ(つまりキャッシュ制御ヘッダが送出されなくなる=普通にキャッシュされる?)となります。

私の方でもsession_cache_limiterに"private, must-revalidate"を設定したらキャッシュ制御ヘッダが送信されてこないことを確認しました。(PHP 5.2.3を使用)

システム的やセキュリティ面を考えると「ページの有効期限切れ」に対してユーザに理解を求めるべきだと思いますが、他のWebサイトも苦し紛れに対応しているおかげで表示されることが滅多に無く理解を得にくのが現状です。

なので現実解としてはprivate_no_expireかprivateを指定する事になると思います。
ただ、データが二重登録されちゃうなどのトラブルに発展することが想定される場合はトークンのよーなロジックを導入して二重submitを防いだり、キャッシュを行わないように制御するべきだと考えます。


【2007.7.26追記】

色々弄ってましたが、結果的にはnoneを使うことにしました。

理由はprivate_no_expireかprivateの場合、キャッシュばかりが有効になって全くリロードされない現象が発生しやすいからです。

IE6で確認したところ、session_cache_limiterにnoneを指定してキャッシュに関するヘッダの送出しないようにするとリロードもされるし、戻るボタンによる「ページの有効期限切れ」も発生しないようです。

ただし、これはIE6のキャッシュ制御の気まぐれに任せている事になりますので、<a>タグでリンクを貼ってるよーなPHPスクリプトを確実にリロードしたい場合は、GETパラメータにランダムな値を与えるなどしてURLをユニークにする事も必要だと思われます。

|

« 中国の「段ボール肉まん」は「やらせ」でした | トップページ | 帝国ホテルのお味は? »

コメント

元ネタしっかり読んでないけど、none って結局制御放棄してるんですよね?

>単にキャッシュ制御ヘッダーフィールドが送出されなくなるだけである。そうなると、只のHTMLと同様に普通にブラウザにキャッシュされ、結果、「ページの有効期限切れ」画面はブラウザバックでは表示されなくなる。

これってブラウザに任せるってことで、ほとんど public ってことでは?

投稿: HIFa | 2007年12月21日 (金) 15:31

>HIFaさん
確かにnone指定はブラウザ任せとなり、ほとんどのブラウザではpublicと同じ結果になると思います。

ただ、public指定時とは異なり、明確に「キャッシュしろ」とは言っていませんので、ブラウザのキャッシュ制御次第では他の要因に左右されて扱いが変化するかもしれませんね。

投稿: KAZU- | 2007年12月21日 (金) 17:05

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/26493/7202744

この記事へのトラックバック一覧です: PHPのsession_cache_limiterで"private, must-revalidate"の指定は間違ってる:

« 中国の「段ボール肉まん」は「やらせ」でした | トップページ | 帝国ホテルのお味は? »