蝸牛の歩み

蝸牛の如く,ゆっくりでも着実に前へ・・・

session

phpのsessionを使っているのだが,ブラウザの戻るボタンで戻ろうとすると

警告 : ページの有効期限切れ

要求したページは、フォームで送信された情報を使用して作成されました。このページは、もう利用できません。セキュリティ保護のため、情報は自動的には再送信されません。
情報を再送信し、この Web ページを表示するには、ツール バーの [更新] ボタンをクリックしてください。
(IEの場合)

だとか,

本当にもう一度フォームを送信しますか?
このページを再び開くには、最初に開いたときに記入したフォームを再送する必要があります。最初にこのフォームを送信したときのWebサイト側の動作が繰り返される可能性があります。
(Safariの場合)

と警告される.しかもIEの場合,うっかりツールバーの更新ボタンをクリックしてしまうと,フレームを使っている関係上トップページに戻されてしまう(右クリック→最新の情報に更新,なら大丈夫).

これは,php.iniで

session.cache_limiter = nocache

と設定しているためらしい.session_start()する前に,session_cache_limiter(' private_no_expire')すればよい.
参考:

privateと設定すること も可能で、この場合、プロキシがキャッシュすることは許可しませんが クライアントがキャッシュすることは許可されます。
privateモードにおいて、Expireヘッダがクライアントに送信されます。これは、Mozillaのようないくつかのブラウザを混乱させます。これを避けるには、 private_no_expireモードを使用して下さい。 このモードでは、Expireヘッダはクライアントに送信されません。

If you have a dinamic website and want to allow your visitors to use the back button after they sent a form with the post method, the best combination I found was:

<?php

header("Expires: Sat, 01 Jan 2000 00:00:00 GMT");
header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT");
header("Cache-Control: post-check=0, pre-check=0",false);
session_cache_limiter("must-revalidate");

// and after you start the session
session_start();

?>

private_no_expire がブラウザでキャッシュさせる方法なのに対し,こちらはキャッシュさせない方法だと思われる.