1. TOP
  2. Perl / PHP Web
  3. [php] 「ページの有効期限切れ・フォーム再送信の確認」の対策

[php] 「ページの有効期限切れ・フォーム再送信の確認」の対策

カテゴリ:
Perl / PHP
Web
| トラックバック(0)
投稿者:yo yo

原因

  • SESSIONを使っている
  • POSTでパラメータを送信
  • ブラウザの「戻る」を押した

犯人はだれだ?

原因は、PHPでSESSIONを使うと(デフォルト設定では)自動でキャッシュ制御用のHTTPヘッダーが送出され、それによりクライアント側のキャッシュが使用不可にされるため。(参考:floatingdays: PHPでブラウザキャッシュを有効にする)

つまり、下記条件を全て満たした場合にこの現象が発生する。

  • HTTP POSTで遷移してきた。
  • SESSIONを使っている。(session_start()してるか、php.ini等でsession.auto_start=1に設定している。)
  • 次のページに行ってから、ブラウザの履歴機能(JavaScriptのhistory.back()を含む)で戻ってきた。
PHPで 「Webページの有効期限が切れてます」となる時の傾向と対策 - floatingdays

対策

方法1

session_start()する前に、session_cache_limiter('none')を書く。SESSIONを利用しても余計なHTTPヘッダが送出されない。

  session_cache_limiter('none');
  session_start();
  // フォーム

cache_limiterにnoneというパラメータは無いからパラメータエラーとなり、結果的にHTTPヘッダを送信しないという挙動になっているらしい。

PHP: session_cache_limiter - Manual

方法2 こっちが正解

header();に色々書いて、ブラウザキャッシュを表示させる。ただし、SESSIONの最新情報が入っていないので注意が必要。

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

« [pushState + ajax] ページの動的遷移 PJAXを実装してみよう・・・? | ホーム | [js] 電話番号のフォーマット、フォームでのバリデーション的なアレ »

トラックバック

http://pulltab.info/mt/mt-tb.cgi/142
ページの先頭に戻る