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

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

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

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

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

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

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

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

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

Один из способов – перенаправить POST на страницу, которая перенаправляется на GET – см. « Сообщение / Перенаправление / Получить по википедии» .

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


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

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

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

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

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

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

Я использую переменную 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']); } с //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. Но это помогает мне отслеживать, какие данные пришли откуда.

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

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

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

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

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

Просмотреть полные или короткие ответы