ページの有効期限切れ
前提
以下のような、3画面遷移のアンケート機能を前提とする。
- A.php
- フォームを表示して、入力を促す。ユーザは入力後、POST送信する。
- B.php
- 入力されたデータを表示して、確認を求める。よければ次の画面へ進む。
- C.php
- 登録完了の旨を表示する。
「ページの有効期限切れ」が起きるケース
- A→B→Cと遷移する。
- Cが表示されている時にブラウザの「戻る」ボタンを押す。
- すると、Bの画面は表示されず、「ページの有効期限切れ」と表示される。
「ページの有効期限切れ」の理由
- Bが表示された時のHTMLは、ブラウザにキャッシュされる。
- したがって、CからBに戻った時、ブラウザがそのキャッシュを使えば問題ない。
- しかし、ブラウザはキャッシュを使わず、エラーメッセージ(有効期限切れ)を表示して、サーバにデータを取得するように警告する。
- これは、BのPHPスクリプトでセッションを使っている場合、BのHTMLデータを送る際にブラウザにキャッシュしないように指示するHTTPヘッダを自動的に付加するから。
対処方法
POSTでなくGETを使う
すなわち、AのHTMLで、
<form method=get>
略
</form>
のようにする。
リダイレクトをかませる
B.phpをB0.phpとB1.phpに分けて、B0からB1へはリダイレクトさせる。具体的な処理の内容は以下のよう。
- B0.php
- 入力データをセッションに入れる。必要ならヴァリデートなど他のロジックも実装する。最後にheader("Location: B1.php")する。
- B1.php
- セッションからデータを取得して、HTMLで表示する。
キャッシュをコントロールする
B.phpで以下のようなコードでBの画面を表示する際に必ずキャッシュを使うようにブラウザに指示する。
session_cache_limiter("private_no_expire");
session_start();
session_cache_limiter()はsession_start()の前にコールすること。
付記
どの対処方法にするかはケースバイケースだが、
- キャッシュをコントロールする
- 「戻る」ボタンを押した時に直前に入力したデータがフォームに埋まってて欲しい時
- リダイレクトをかませる
- 2重登録をさせたくなくて、キャッシュを使わせると混乱しそうな場合
のような感じだろうか。