ユーザーが [戻る] ボタンを押した場合に、古いフォーム データの再処理を防ぐために使用されるメカニズムを単純化しようとして、新しいパラダイムに沿って多数のフォームを書き直しています。FF21、ie10(!)、Opera12.15 で動作する最小限のテスト ケースに要約しましたが、Chrome 27.0 と Safari 5.1.7 ではまあまあしか動作しませんでした。問題が予想されるブラウザではありませんでした。ということで、多分自分のせいです。
フォーム view.php は常に post.php に投稿し、post.php がすべての作業を行ってから view.php にリダイレクトします。(これらのいくつかは、何人かのユーザーが何度も繰り返す設計ページです。) 私の目標は、「ブラウザーはデータを再送信する必要があります」というメッセージを回避すること、ブラウザーがキャッシュされたビューを使用しないようにすること、および view.php が長時間を残さないようにすることです。歴史の跡。(一部の情報源は、PRG がそれを防いでいると述べています。) 3 つの目標はすべて、歴史が成長しない FF、Opera、および IE で達成されます。Chrome と Safari では、履歴に同一のページ ビューの痕跡が表示されます。リクエスト/レスポンス ヘッダーを見ると、Chrome は再アクセスされた履歴ページの完全な GET を実行しているように見えますが、過去のフィールド値と現在のフィールド値が混在しています。同じぺージに(!)。1 つのページに決して共存することのない値の組み合わせを表示することは、私にとって最も混乱を招く側面だと思います。Chrome でソースを表示すると、常に最新のコピーが表示されます。そして、私は以下の正確な蒸留例の動作について話しているのであって、それらのより複雑なバージョンではありません。
フィールド 1 は内部カウンターをエコーし、ユーザー入力を無視します。読み取り専用かどうかに関係なく、同じ奇妙な方法で動作します。
フィールド 2 はユーザー入力をエコーします。通常、フィールド 1 をコピーまたは追加します。
view.php
<?php
session_start();
header('Cache-Control:private,no-store,no-cache,must-revalidate,post-check=0,pre-check=0');
header('Pragma: no-cache');
$cval = !isset($_SESSION['counter']) ? 0 : $_SESSION['counter'];
$word = !isset($_SESSION['word']) ? '' : htmlentities($_SESSION['word'],ENT_QUOTES,'UTF-8',FALSE);
echo <<<HTM
<pre>
<form method='POST' action='post.php'>
<input type='text' name='count' value='$cval'/>
<input type='text' name='word' value='$word'/>
<input type='submit' name='doit' value='Submit'/>
</form>
</pre>
HTM;
?>
post.php
<?php
session_start();
if(!isset($_SESSION['counter'])):
$_SESSION['counter'] = 1;
else:
$_SESSION['counter'] += 1;
endif;
$_SESSION['word'] = !isset($_POST['word']) ? '' : $_POST['word'];
header('Location: view.php');
?>
履歴のバックアップを開始すると、Chrome は最新のフィールド 1 の値を表示する傾向がありますが、過去のフィールド 2 の値を表示します。時折、両方で履歴が表示されます。その不一致がなければ、(ペア ネットワーク上の) サーバーまたはプロキシがページをキャッシュするのを防ぐことができなかったと思います。
「Expires: -1」ヘッダーを追加すると、同じことが行われます。
古いフォームの認識を処理できます。私ができないように見えるのは、ユーザーがアクセスしたり送信したりするのを防ぐことです。view.php の増分 GET 引数は、予測不可能なキャッシュ ビューを防ぎますが、すべてのブラウザーで明示的な履歴を作成し、ラチェットを逆方向に回すよう人々を招待するだけです。
なぜこれが起こっているのですか?修正可能ですか?