Кнопка "Назад" повторно отправить данные формы ($POST)


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

Пример:

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

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

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

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

Author: Cudos, 2010-01-27

6 answers

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

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


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

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

Смотрите страницу Опубликовать/Перенаправить/Получить в википедии об этом.

 23
Author: Pascal MARTIN, 2010-01-27 11:34:54

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

 1
Author: Ignacio Vazquez-Abrams, 2010-01-27 11:31:10

Не используйте СООБЩЕНИЕ для поиска. Поиск можно безопасно выполнять с помощью GET, так как это ничего не изменит.

 1
Author: Pim Jager, 2010-01-27 11:35:48

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

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

    header_remove("Expires");
    header_remove("Cache-Control");
    header_remove("Pragma");
    header_remove("Last-Modified");
 1
Author: Chung Lau, 2011-09-19 20:31:26

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

Например.

$_SESSION['имя'] = $_POST['имя'];

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

 0
Author: , 2017-09-02 00:26:10