Кнопка «Назад» повторно отправляет данные формы ($ _POST) - PullRequest
19 голосов
/ 27 января 2010

Моя проблема в том, что кнопка "Назад" заставляет браузер говорить что-то вроде "Страница устарела", когда предыдущая страница была создана формой.

Пример:

  • page1:форма, отправленная с критериями поиска (запрос $ _POST, форма указывает на страницу 2)
  • page2: получает запрос $ _POST и показывает результат (список пользователей со ссылками, указывает на страницу 3)
  • страница 3: показатьпрофиль пользователя

Теперь, когда посетитель нажимает кнопку «Назад» в браузере, он отображает что-то вроде «Страница устарела».

Вместо этого предыдущая страница должна отображаться без предупреждений (page2, с списком пользователей)

Как ваши стратегии обойти это поведение?

Ответы [ 6 ]

23 голосов
/ 27 января 2010

Если вы отправляете for с параметрами поиска, вы пытаетесь получить некоторых данных, а не изменять их.

Таким образом, вы должны использовать метод HTTP GET, а не POST: POST следует использовать, когда вы собираетесь создавать / изменять данные, и GET следует использовать, когда вы собираетесь извлечь некоторые данные.


Или, если у вас есть какая-то операция создания / изменения, которая должна быть выполнена:

  • Форма первого сообщения на первой странице
    • Эта страница выполняет некоторые операции (например, запись чего-либо в базу данных)
    • А затем перенаправляет на другую страницу, используя HTTP-заголовок Location.
  • Это последняя страница, которая запрашивается браузером с помощью GET-запросов и отображает данные, извлеченные из параметров, полученных в URL.

См. Страницу Post / Redirect / Get в Википедии, об этом.

14 голосов
/ 27 января 2010

Используйте шаблон Post / Redirect / Get (PRG) .

PRG Pattern

1 голос
/ 20 сентября 2011

Это относится к PHP и IE8.

Мало того, что вы должны установить кэширование как частное, но вы должны удалить 4 заголовка кэширования, и это можно сделать только с PHP 5.3 В PHP 5.2 вы можете установить пустые значения для 4 заголовков только при использовании метода Zend Framework setHeader (). По какой-то причине в IE8 недостаточно установить 4 значения заголовка в пустые значения. Вот код для PHP 5.3:

    header_remove("Expires");
    header_remove("Cache-Control");
    header_remove("Pragma");
    header_remove("Last-Modified");
1 голос
/ 27 января 2010

Не используйте POST для поиска. Поиск можно безопасно выполнить с помощью GET, поскольку он ничего не изменит.

1 голос
/ 27 января 2010

Отправьте заголовок Location в сценарии, к которому вы добавили POST, указывая на страницу, которая идет после.

0 голосов
/ 02 сентября 2017

Вы можете использовать сеанс для этого.

например.

$ _ SESSION ['name'] = $ _POST ['name'];

Запомните, чтобы сбросить переменные после завершения процесса, чтобы оптимизировать использование памяти.

...