6
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

POST送信を行っているページにBackするとエラーが出る際の対処法

Last updated at Posted at 2018-03-19

POST送信を行っているページにBackするとエラーが出る際の対処法

経緯
クライアント「ブラウザで戻る、進むをした時に、エラーが出ないようにしてほしい」
僕「なるほど やってみます:fist:

備忘録メモ
実際にはまっていた理由はsession_start();がソース上にいくつもあって、どこが本当に利用されているのかわからなかったからなんだけど…
やっぱりフレームワークはちゃんと使った方がいいよね…

参考にさせていいただいたサイト:sunny:

エラーの内容と原因

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.inisession.cache_limiterの設定値を変えてあげても同じことができる(と思う。)
でもこれを使うと、headerが全く出力されず、他の部分に影響が出る可能性もある(らしい)

対策2 headerを直接変更する

以下のように、headerを直接上書きする。

<?php
session_start();
header('Expires:');
header('Cache-Control:');
header('Pragma:');

ソース的には長いし、何か物々しい感じがするが、明示的にheaderを制御していることがわかるので、可読性は高いのかもしれない。
とりあえず自分的にはこれを使うようにする。

実際の動作を確認しても、POST送信したページにエラー表示なく戻ることができた。
しかし、表示されているのはあくまでもキャッシュされたページに過ぎないので、最新の情報を表示させる必要があったり、フォームの確認画面で2重送信の危険があったりというところでは、この対応はとるべきではないと思う。

6
15
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?