3流プログラマのメモ書き

元開発職→社内SE→派遣で営業支援の三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。(jehupc.exblog.jpから移転中)

(PHP)セッションを使ってて入力フォームページに戻ると入力内容がクリアされる

PHPでセッションを使って入力フォームページから、入力内容確認ページに飛ばしているのですが、入力内容確認ページで戻るボタンを押下すると、入力した内容が消えています。

セッションを使わないと入力フォームページに戻っても、入力内容は消えません。

確かセッションを使ってなかったときはそんなふうにならなかったのに..と思って調べてみたところ、PHPではセッションを使っているとキャッシュしないような設定になるようです。

なのでキャッシュを許す設定にしないといけません。

session_cache_limiter 関数を session_start() より前に書くことで、キャッシュの設定ができるようです。

session_cache_limiterの引数ですが、下記のような組み合わせになるようです。

nocache : クライアント/プロキシのキャッシュを許可しない

下記ヘッダを送信。

 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

public : クライアント/プロキシのキャッシュを許可する

下記ヘッダを送信。

 Expires: (未来のいつか、session.cache_expires による)

 Cache-Control: public, max-age=(未来のいつか、session.cache_expire による)

 Last-Modified: (セッションが最後に保存されたときのタイムスタンプ)

private : クライアントのキャッシュを許可し、プロキシのキャッシュを許可しない

下記ヘッダを送信。

 Expires: Thu, 19 Nov 1981 08:52:00 GMT

 Cache-Control: private, max-age=(session.cache_expire ぶんだけ未来), pre-check=(session.cache_expire ぶんだけ未来)

 Last-Modified: (セッションが最後に保存されたときのタイムスタンプ)

private_no_expire : 機能はprivateと同じだが、Mozilla系を混乱させないためExpiresヘッダを送信しない

下記ヘッダを送信。

 Cache-Control: private, max-age=(session.cache_expire ぶんだけ未来), pre-check=(session.cache_expire ぶんだけ未来)

 Last-Modified: (セッションが最後に保存されたときのタイムスタンプ)

あと、上記以外の引数を与えると、Cache-Control:ヘッダは付加されないようです。 "none" を指定するといいというサイトもありましたが、実はヘッダを付加してないだけなんですね。

また、この方法を使わずに(PHP)Smarty利用時に入力チェックエラー時に入力画面に戻し入力データを再表示する方法にあるように、ユーザ入力データをセッション変数に持たし、入力ページで初期接続でなければ再表示するという方法もあります。

参考:

PHP公式リファレンス:session_cache_limiter

「ページの有効期限切れ」をsession_cache_limiter()で解決 - shinyanakaoのよすがブログ

PHPリファレンス(session_cache_limiter())

session_cache_limiter - システム開発者の実験記