Webページにパラメーターの長いリストを提供するアプリケーションがあるため、GETの代わりにPOSTを使用する必要があります。問題は、ページが表示され、ユーザーが[戻る]ボタン、Firefox警告が表示されます。
このページを表示するには、Firefoxは、以前に実行されたアクション(検索や注文確認など)を繰り返す情報を送信する必要があります。
アプリケーションは、戻ることが非常に一般的な操作であるように構築されているため、これはエンドユーザーにとって本当に迷惑です。
基本的に、私はこのページのようにそれをしたいと思います:
http://www.pikanya.net/testcache/
何かを入力して送信し、[戻る]ボタンをクリックします。警告はありません。ただ戻ります。
グーグルグーグル私はこれがFirefox 3のバグかもしれないことを発見したが、彼らがそれを「修正」した後でも、どういうわけかこの挙動を得たいと思う。
私はそれがいくつかのHTTPヘッダーで実行できると思いますが、正確にはどれですか?
1つの方法として、POST=をGETにリダイレクトするページにリダイレクトします。 ポスト/リダイレクト/ウィキペディアで取得 を参照してください。
あなたのPOSTは4Kのフォームデータです。おそらく、あなたのサーバーは、データベースに保存するなど、一度表示して捨てるのではなく、そのデータを使って何かをします。巨大な検索フォームの場合は、データベースに一時コピーを作成し、数日後に削除するか、スペース制限が使用されている場合はLRU単位で削除します。GETを使用してアクセスできるデータの表現を作成します。一時的に、そのIDを生成し、URLとして使用します;永続的なデータセットの場合、おそらくIDまたはURLに使用できるものがあります。最悪の場合、小さなURLが使用するようなアルゴリズムは、大きなURLをはるかに小さいURLにリダイレクトします。POSTをリダイレクトして、データの表現を取得します。
歴史的なメモとして、この手法は 1995年に確立された実践 でした。
ここで私のウェブプログラミングの黄金律をご覧ください:
「POSTリクエストに対して決してボディで応答することはありません。常に作業を行い、Location:ヘッダーで応答して更新されたページにリダイレクトし、ブラウザーがGETで要求するようにします。
ブラウザが再POSTについてユーザーに尋ねる場合、Webアプリは壊れています。ユーザーはこの質問を見ないでください。
この警告/動作を回避する1つの方法は、AJAXを介してPOSTを実行し、ユーザーを別のページに送信する(または送信しない)ことです。
この状況を支援するために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という変数に戻す必要さえありません。しかし、どのデータがどこから来たかを追跡するのに役立ちます。
Webページにパラメーターの長いリストを提供するアプリケーションがあるため、GETの代わりにPOSTを使用する必要があります。問題は、ページが表示され、ユーザーが[戻る]ボタン、Firefox警告が表示されます。
あなたの推論は間違っています。リクエストに副作用がない場合は、GETである必要があります。副作用がある場合は、POSTである必要があります。選択は、渡す必要のあるパラメーターの数に基づいてはいけません。