17

HTMLフォームを使用して変数をページからページに転送し、PHPスクリプトを使用して送信された値に基づいてページを作成しています。一般的には次のように表示されます: アイテムのカタログから必要なものを選択すると、次のページにこの特定のアイテムの詳細が表示されます。1 つのことを除いて、すべてが完璧に機能します。

ブラウザーの [戻る] ボタンを使用するたびに、常にエラーが表示されます: ERR_CACHE_MISSとページを更新してから、本当にデータを再送信することを確認する必要があります。

これを修正する方法はありますか?私の顧客は、本来のように [戻る] ボタンを使用することができます。

ブラウザが提供する全文は次のとおりです。

この Web ページを正しく表示するには、以前に入力したデータが必要です。このデータを再度送信することはできますが、送信すると、このページで以前に実行したアクションが繰り返されます。この Web ページを再読み込みします。リロード ボタンを押して、ページの読み込みに必要なデータを再送信します。エラー コード: ERR_CACHE_MISS

4

6 に答える 6

29

php やその他のデータを使用してフォームを投稿すると、ページに戻ってブラウザに「ドキュメントの有効期限が切れています」や「Chrome でフォームの再送信を確認してください」などのメッセージが表示される場合があります。これらのメッセージは、ブラウザーが投稿変数などの機密データで使用する安全対策です。ブラウザーは自動的に新しいページを再び提供することはありません。[再試行] をクリックするか、ページを更新して、ページをリロードする必要があります。その後、期待どおりに動作します。

ただし、php コーダーは、スクリプトに小さなコードを追加することで、ブラウザーからの迷惑なメッセージを回避できます。この例は、ハングアップせずに投稿するときにページを前後に移動できるようにするために、session_start() の上に追加できる数行のコードを示しています。「private_no_expire」モードは、クライアントがそもそも期限切れのヘッダー。

header('Cache-Control: no cache'); //no cache
session_cache_limiter('private_no_expire'); // works
//session_cache_limiter('public'); // works too
session_start();
于 2014-11-29T06:20:43.180 に答える
9

** 背景: Bruce (sqlwork.com) の優れた説明に感謝します。

この Web ページを正しく表示するには、以前に入力したデータが必要です。このデータを再度送信することはできますが、送信すると、このページで以前に実行したアクションが繰り返されます。Reload を押すと、そのデータが再送信され、このページが表示されます。

Web 開発者のずさんなコーディング慣行のため、ブラウザはこのメッセージを追加せざるを得ませんでした。シナリオは次のとおりです。

1) ユーザーがフォームに入力して送信 (フォームを投稿) 2) サーバーが投稿データを処理し、キャッシュ不可としてマークされた新しいページ (確認) で応答 3) ユーザーが新しいページに移動。4) ユーザーが押し戻す:

ブラウザーがステップ 2 でページを表示するには、キャッシュなしとマークされているため、サーバーから要求する必要があります。つまり、データの再投稿を行います (ステップ 1 を実行します)。これがずさんなコーディングが入ってきた場合です。これがクレジットカードの請求であり、再投稿の検出がサーバー上になかった場合、カードは2回請求されます. これは非常に一般的な問題であり、ブラウザはこれを検出してユーザーに警告する必要がありました。

最善の修正はステップ 2 で、サーバーは確認ページにリダイレクトを送信します。その後、ユーザーが履歴またはバックを介して確認にアクセスすると、投稿リクエストではなく取得リクエストであり、警告は表示されません。

注: Web フォームのポストバック モデルは、この問題に役立ちます。また、サーバー転送を回避します。

私の解決策

$_SESSION['home'] は、ホームページのエラーを保存するために使用されます。

$_SESSION['tempEmail'] は、php フォームで値をエコーするために使用されます。

注: エラー処理用の HTML フォームを含むページごとに一意のセッション変数を 1 つ使用し、HTML フォームでエコーされる値ごとに任意のセッション変数を使用します。

<?php
session_start(); 

//Initialize variables not initialized without overwriting previously set variables.
if(!isset($_SESSION['home'])) {
$_SESSION['home']="";
$_SESSION['tempEmail']="";
}

オプション - ログインしている場合は、電子メール アドレスを $_SESSION['tempEmail'] 変数に割り当てて (まだ行っていない場合)、HTML フォームに事前入力します。

if(isset($_POST['Submit'])){

---your code---


    //Error message(s) examples
    $_SESSION['home'] = "Email and Password do not match, please try again.";
    header("Location: " . $_SERVER['REQUEST_URI']);

    $_SESSION['home'] = "Email address format is invalid.  Please recheck.";
    header("Location: " . $_SERVER['REQUEST_URI']);

    //success
    unset ($_SESSION['home']); //optional, unset to clear form values.
    header ("location: nextpage.php"); 
             ---or---
    header("Location: " . $_SERVER['REQUEST_URI']);  //re-post to same page with the $_SESSION['home'] success message.   
}
?>



<body>

エラーボックス

<span><strong class="error"><?php echo $_SESSION['home'] ?></strong></span>

HTMLフォーム

<form action="#" name="loginform" method="post" >
    <input type="text" name="userEmail" maxlength="50" title="Enter Your email" autocomplete="off" value="<?php echo htmlspecialchars($_SESSION['tempEmail']); ?>" placeholder="enter email" required/>
    <input type="submit" name="Submit" value="Submit">
</form>

</body>

支払いページでの使用は推奨されません。上記の説明を参照してください。Firefox、Chrome、Safari、IE9 でテスト済み。戻るボタンを使用すると、迷惑なメッセージがなくなりました。ヘッダー警告を回避するために、php スクリプトまたは php.ini で出力バッファリングが「オン」になっていることを確認してください。php.ini ファイルで次のことを確認できます。

output_buffering=On
于 2013-11-08T04:47:18.570 に答える
8

私はちょうど使用することを発見しました:

header('Cache-Control: no cache'); //disable validation of form by the browser

問題を解決する

于 2016-05-05T09:42:44.830 に答える
4

私はこの答えを試しましたが、大丈夫です。このコードを前に置く必要があります: session_start():

session_cache_limiter('private, must-revalidate');
session_cache_expire(60);

幸運を

于 2015-10-28T11:26:11.463 に答える