PHPを使ってWebページを作っていると、ブラウザの戻るボタンを押した時に「Webページの有効期限が切れています」と表示されることがあります。

私が日頃利用しているChoromeブラウザだと以下のような画面が表示されます。(IE、Firefox、Opera、Safariなどはまた別の画面が表示されます。)

Chomeで表示されるフォームの再送信画面

このように表示される原因は3つの条件を満たした時に発生します。

  1. POSTでパラメータを送信している。
  2. SESSIONを使っている。
  3. ブラウザの「戻る」ボタンを押した。

原因はPHPでSESSIONを利用すると、自動的にキャッシュ制御用のHTTPヘッダが送信されることにより、クライアント側でキャッシュが利用できなくなることによって発生しているそうです。

解決方法です。

SESSIONを開始しているところで、以下のように書いておけばこの問題は解決します。

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

このように記述することで余計なHTTPヘッダーを送信することがなくなります。

session_cache_limiter(‘none’)を使う方法でもこの問題は解決するのですが、’none’をパラメータに指定するということは、パラメータエラーとなり、結果的にHTTPヘッダを送信しないという挙動になっているそうです。今回の方法のほうがお行儀が良いとのことです。

この内容に関してはfloatingdaysさんの”PHPで「Webページの有効期限が切れています」となる時の傾向と対策“というエントリにとても詳しく書いてくださっています。今回のエントリを書くに当たって、かなり参考にさせて頂きました。ぜひ参考にしてください。

会社勤めだった時に、ブラウザの「戻る」と「更新」ボタン対策にとても苦労したことを覚えています。
今回作っているWebアプリでは苦労することなく、対策ができています。人間の知識の積み重ねとはすごいものだと実感しました。