web-dev-qa-db-ja.com

[戻る]ボタンがPOST確認アラートを表示しないようにする

Webページにパラメーターの長いリストを提供するアプリケーションがあるため、GETの代わりにPOSTを使用する必要があります。問題は、ページが表示され、ユーザーが[戻る]ボタン、Firefox警告が表示されます。

このページを表示するには、Firefoxは、以前に実行されたアクション(検索や注文確認など)を繰り返す情報を送信する必要があります。

アプリケーションは、戻ることが非常に一般的な操作であるように構築されているため、これはエンドユーザーにとって本当に迷惑です。

基本的に、私はこのページのようにそれをしたいと思います:

http://www.pikanya.net/testcache/

何かを入力して送信し、[戻る]ボタンをクリックします。警告はありません。ただ戻ります。

グーグルグーグル私はこれがFirefox 3のバグかもしれないことを発見したが、彼らがそれを「修正」した後でも、どういうわけかこの挙動を得たいと思う。

私はそれがいくつかのHTTPヘッダーで実行できると思いますが、正確にはどれですか?

39
Milan Babuškov

1つの方法として、POST=をGETにリダイレクトするページにリダイレクトします。 ポスト/リダイレクト/ウィキペディアで取得 を参照してください。

あなたのPOSTは4Kのフォームデータです。おそらく、あなたのサーバーは、データベースに保存するなど、一度表示して捨てるのではなく、そのデータを使って何かをします。巨大な検索フォームの場合は、データベースに一時コピーを作成し、数日後に削除するか、スペース制限が使用されている場合はLRU単位で削除します。GETを使用してアクセスできるデータの表現を作成します。一時的に、そのIDを生成し、URLとして使用します;永続的なデータセットの場合、おそらくIDまたはURLに使用できるものがあります。最悪の場合、小さなURLが使用するようなアルゴリズムは、大きなURLをはるかに小さいURLにリダイレクトします。POSTをリダイレクトして、データの表現を取得します。


歴史的なメモとして、この手法は 1995年に確立された実践 でした。

28
Pete Kirkham

ここで私のウェブプログラミングの黄金律をご覧ください:

データベースへのデータの挿入を2回停止する

「POSTリクエストに対して決してボディで応答することはありません。常に作業を行い、Location:ヘッダーで応答して更新されたページにリダイレクトし、ブラウザーがGETで要求するようにします。

ブラウザが再POSTについてユーザーに尋ねる場合、Webアプリは壊れています。ユーザーはこの質問を見ないでください。

37
Ilya Birman

この警告/動作を回避する1つの方法は、AJAXを介してPOSTを実行し、ユーザーを別のページに送信する(または送信しない)ことです。

3
Sparr

この状況を支援するためにSession変数を使用しています。ここで私が長年使ってきた方法は次のとおりです。

//If there's something in the POST, move it to the session and then redirect right back to where we are
if ($_POST) {
    $_SESSION['POST']=$_POST;
    redirect($_SERVER["REQUEST_URI"]);
}

//If there's something in the SESSION POST, move it back to the POST and clear the SESSION POST
if ($_SESSION['POST']) {
    $_POST=$_SESSION['POST'];
    unset($_SESSION['POST']);
}

技術的には、$ _ POSTという変数に戻す必要さえありません。しかし、どのデータがどこから来たかを追跡するのに役立ちます。

2
rgbflawed

Webページにパラメーターの長いリストを提供するアプリケーションがあるため、GETの代わりにPOSTを使用する必要があります。問題は、ページが表示され、ユーザーが[戻る]ボタン、Firefox警告が表示されます。

あなたの推論は間違っています。リクエストに副作用がない場合は、GETである必要があります。副作用がある場合は、POSTである必要があります。選択は、渡す必要のあるパラメーターの数に基づいてはいけません。

1
troelskn