Кнопка "Назад" повторно отправляет данные формы ($_POST)

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

Пример:

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

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

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

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

6 ответов

Решение

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

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


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

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

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

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

PRG Pattern

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

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

    header_remove("Expires");
    header_remove("Cache-Control");
    header_remove("Pragma");
    header_remove("Last-Modified");

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

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

Вы можете использовать сессию, чтобы сделать это.

например.

$ _SESSION ['name'] = $ _POST ['name'];

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

Другие вопросы по тегам