Кнопка "Предотвратить обратную связь" отображает уведомление о подтверждении POST

У меня есть приложение, которое предоставляет длинный список параметров для веб-страницы, поэтому я должен использовать POST вместо GET. Проблема в том, что когда страница отображается, а пользователь нажимает кнопку "Назад", Firefox выводит предупреждение:

Чтобы отобразить эту страницу, Firefox должен отправить информацию, которая будет повторять любые действия (например, поиск или подтверждение заказа), которые были выполнены ранее.

Так как приложение построено таким образом, что возвращение - довольно распространенная операция, это действительно раздражает конечных пользователей.

В принципе, я хотел бы сделать это так, как делает эта страница:

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

Введите что-нибудь, отправьте и нажмите кнопку "Назад". Нет предупреждения, он просто возвращается.

Googling Я узнал, что это может быть ошибкой в ​​Firefox 3, но я хотел бы как-то получить это поведение даже после того, как они "исправит" его.

Я предполагаю, что это может быть выполнимо с некоторыми HTTP-заголовками, но что именно?

Ответ 1

Один из способов: перенаправить POST на страницу, которая перенаправляется на GET - см. Post/Redirect/Get on wikipedia.

Скажите, что ваш POST - это 4K данных формы. Предположительно, ваш сервер делает что-то с этими данными, а не просто отображает его один раз и отбрасывает, например, сохраняя его в базе данных. Продолжайте делать это, или если это огромная форма поиска, создайте временную копию ее в базе данных, которая очищается через несколько дней или на основе LRU, когда используется ограничение пробела. Теперь создайте представление данных, к которым можно получить доступ, используя GET. Если он временный, сгенерируйте идентификатор для него и используйте его как URL; если это постоянный набор данных, он, вероятно, имеет идентификатор или что-то, что можно использовать для URL-адреса. В худшем случае такой алгоритм, как крошечный URL-адрес, может свернуть большой URL-адрес на гораздо меньший. Перенаправить POST, чтобы получить представление данных.


В качестве исторической заметки этот метод был установленная практика в 1995 году.

Ответ 2

Смотрите мое золотое правило веб-программирования здесь:

Дважды остановить вставку данных в базу данных

В нем говорится: "Никогда не отвечайте телом на POST-запрос. Всегда выполняйте работу, а затем отвечайте заголовком" Location ", чтобы перенаправить на обновленную страницу, чтобы браузер запрашивал ее с помощью GET"

Если браузер когда-либо спрашивает пользователя о повторном POST, ваше веб-приложение нарушено. Пользователь никогда не должен видеть этот вопрос.

Ответ 3

Один из способов избежать этого предупреждения/поведения - выполнить POST через AJAX, затем отправить пользователя на другую страницу (или нет) отдельно.

Ответ 4

Я использую переменную Session, чтобы помочь в этой ситуации. Здесь метод, который я использую, работал у меня много лет:

//If there 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 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. Но это помогает мне отслеживать, какие данные пришли откуда.

Ответ 5

У меня есть приложение, которое предоставляет длинный список параметров для веб-страницы, поэтому я должен использовать POST вместо GET. Проблема в том, что когда страница отображается, а пользователь нажимает кнопку "Назад", Firefox выводит предупреждение:

Ваши рассуждения ошибочны. Если запрос без побочных эффектов, он должен быть GET. Если он имеет побочные эффекты, он должен быть POST. Выбор не должен основываться на количестве параметров, которые необходимо передать.

Ответ 6

В качестве другого решения вы можете вообще перестать использовать перенаправление.

Вы можете обрабатывать и отображать результат обработки сразу без предупреждения подтверждения POST. Вы должны просто манипулировать объектом истории браузера:

history.replaceState("", "", "/the/result/page")

Смотрите полный или короткий ответ