POST送信を行っているページにBackするとエラーが出る際の対処法
経緯
クライアント「ブラウザで戻る、進むをした時に、エラーが出ないようにしてほしい」
僕「なるほど やってみます」
備忘録メモ
実際にはまっていた理由はsession_start();
がソース上にいくつもあって、どこが本当に利用されているのかわからなかったからなんだけど…
やっぱりフレームワークはちゃんと使った方がいいよね…
参考にさせていいただいたサイト
エラーの内容と原因
POST送信されたデータをもとに処理を行っている画面に、ブラウザの戻るボタンや、JSのBackで戻ろうとすると、有効期限切れエラーが表示されてしまう。
原因は、PHPでSESSIONをStartした際に、Sessionを制御するヘッダーが送信され、ブラウザ側のキャッシュが利用されなくなるため。
そのため、解決策としては「Sessionを制御するヘッダー」をどうにかしてやればよい。
対策1 session_cache_limiter('none')
対策として有名なのは、session_start()する前に、session_cache_limiter('none')とすること。
<?php
session_cache_limiter('none'); //これを追加
session_start();
これにより、SESSIONを使っても余計なHTTPヘッダーが送出されなくなる。
SESSIONの設定を変更しているだけなので、php.ini
のsession.cache_limiter
の設定値を変えてあげても同じことができる(と思う。)
でもこれを使うと、headerが全く出力されず、他の部分に影響が出る可能性もある(らしい)
対策2 headerを直接変更する
以下のように、headerを直接上書きする。
<?php
session_start();
header('Expires:');
header('Cache-Control:');
header('Pragma:');
ソース的には長いし、何か物々しい感じがするが、明示的にheaderを制御していることがわかるので、可読性は高いのかもしれない。
とりあえず自分的にはこれを使うようにする。
実際の動作を確認しても、POST送信したページにエラー表示なく戻ることができた。
しかし、表示されているのはあくまでもキャッシュされたページに過ぎないので、最新の情報を表示させる必要があったり、フォームの確認画面で2重送信の危険があったりというところでは、この対応はとるべきではないと思う。