Запретить кнопке "Назад" показывать оповещение о подтверждении публикации


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

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

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

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

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

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

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

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

Author: bignose, 2009-03-19

6 answers

Один из способов обойти это - перенаправить СООБЩЕНИЕ на страницу, которая перенаправляет на ПОЛУЧЕНИЕ - см. Сообщение/Перенаправление/Получить в википедии.

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


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

 27
Author: Pete Kirkham, 2016-12-25 20:30:05

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

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

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

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

 37
Author: Ilya Birman, 2017-05-23 12:32:29

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

 3
Author: Sparr, 2009-03-18 22:27:36

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

//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
Author: rgbflawed, 2014-10-13 20:40:46

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

Ваши рассуждения неверны. Если запрос без побочных эффектов, его следует ПОЛУЧИТЬ. Если у него есть побочные эффекты, его следует отменить. Выбор не должен основываться на количестве параметров, которые вам нужно передать.

 1
Author: troelskn, 2009-03-19 00:00:24

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

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

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

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

 0
Author: Eugen Konkov, 2017-11-12 11:40:41