7

POSTリクエストを処理した後、同じページにリダイレクトするという非常に標準的なことを行っているため、ユーザーがページをリロードした場合に「フォームの再送信の確認」(または同等の) ダイアログが表示されません。

303 応答ステータス コードを使用しています。

コードは次のとおりです。

header( "HTTP/1.1 303 See Other" );
header( "Location: " . $_SERVER['REQUEST_URI'] );
exit();

これは、Safari と FF で期待どおりに機能します。Chrome で [フォームの再送信の確認] ダイアログが表示されます。

Chrome では、ネットワーク インスペクタを使用して、303 リダイレクトが実際に発行され、最初の POST の後に GET があることを確認できます。

それでも、その時点でページをリロードしようとすると、「フォームの再送信の確認」が表示されます。

偽のクエリ パラメータを追加して URL を変更すると、これは発生しません。あれは...

header( "HTTP/1.1 303 See Other" );
header( "Location: " . $_SERVER['REQUEST_URI'] . '?foo' );
exit();

...うまくいきます。

Chrome は巧妙になりすぎて、同じページのリロードを省略しようとしていますか? それとも、これは既知の問題ですか? 私はしばらく時間をかけて調べましたが、PRG パターンを使用する必要があるだけの人が 100 万人いることを除けば、何もありません。

4

4 に答える 4

10

これは Chrome 25 のバグのようです。Chrome 24 の virtualbox でテストし、Chrome 25 に更新しました。

Chrome 24 => ダイアログなし

Chrome 25 => ダイアログ

たぶん、バグを報告する必要があります。:-)

于 2013-02-23T02:58:32.050 に答える
0

別のURIでスクリプトへのプロキシリダイレクトを試すことができます

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
      header('Location: proxy.php?uri='.$_SERVER['REQUEST_URI'], true, 303);
}

それから戻ってきて

# proxy.php

if (!empty($_GET['uri'])) {
    // maybe some validation here
    header('Location: '.$_GET['uri'], true, 303);
}
于 2013-02-23T22:09:32.313 に答える
0

予期せずシャットダウンされたページをユーザーが復元しようとすると、ブラウザにこのエラー「err_cache_miss」が表示されます。エラーの主な原因のビデオ証明を ご覧ください https://www.youtube.com/watch?v=6c9ztzqlthE

于 2013-11-12T13:22:51.053 に答える