ページの有効期限切れ対策

PHPのセッションを使った動的なページ(フォーム送信等)からブラウザの戻るボタン(history.back();)で前のページに戻ったときに「Webページの有効期限が切れてます」(Chromeでは「フォーム再送信の確認」)と出る。これはsession_cache_limiterの設定がデフォルトで’nocache’になっており、PHPのセッション使用時にクライアントキャッシュが無効になるため。

その対策として、よく見かけるのが以下。

session_cache_limiter('none');
session_start();

 
私自身も今まで特に気にせず上記を使用していたのだが、session_cache_limiter() にはそもそも’none’というパラメータは無いので引数として無効となる。引数が無効となった場合、キャッシュコントロールヘッダが吐き出されなくなるので期限切れ問題が起こらないという仕組みらしい。

引数が無効になればよいので、’none’でなくても何でもいいのだが、規格外の動きをさせるのは気持ち悪い。よって、もう少しお行儀のよい書き方として下記の2種類が挙げられる。

 
1. 直接headerを記述して制御する

session_start();
header('Expires: -1');
header('Cache-Control:');
header('Pragma:');

 
2. ‘private_no_expire’ を使用する例
php.netには’private_no_expire’が推奨されている。’private_no_expire’ではIE限定と思われるがsession.cache_expireの分だけキャッシュが効くようなので、効かないようにsession_cache_expire(0)を設定しておく。

session_cache_expire(0);
session_cache_limiter('private_no_expire');
session_start();

 
以上、備忘録でした。