Кнопка "Назад" повторно отправляет данные формы ($_POST)
Моя проблема в том, что кнопка "Назад" заставляет браузер говорить что-то вроде "Страница истекла", когда предыдущая страница была создана формой.
Пример:
- page1: форма отправлена с критериями поиска (запрос $_POST, форма указывает на страницу 2)
- page2: получает запрос $_POST и показывает результат (список пользователей со ссылками, указывает на страницу 3)
- page3: Показать профиль пользователя
Теперь, когда посетитель нажимает кнопку "Назад" в браузере, он показывает что-то вроде "Страница просрочена".
Вместо этого предыдущая страница должна отображаться без предупреждений (страница 2 с списком пользователей)
Как ваши стратегии обойти это поведение?
6 ответов
Если вы отправляете запрос с параметрами поиска, вы пытаетесь получить некоторые данные, а не изменять их.
Таким образом, вы должны использовать метод HTTP GET, а не POST: POST следует использовать, когда вы собираетесь создавать / изменять данные, и GET следует использовать, когда вы собираетесь извлечь некоторые данные.
Или, если у вас есть какая-то операция создания / изменения, которая должна быть сделана:
- Форма первого сообщения на первую страницу
- Эта страница выполняет некоторые операции (например, запись чего-либо в базу данных)
- А затем перенаправляет на другую страницу, используя
Location
HTTP заголовок.
- Именно эта последняя страница, которая запрашивается браузером с помощью запросов GET, отображает данные, извлеченные из параметров, полученных в URL.
См. Страницу Post / Redirect / Get в Википедии об этом.
Это относится к 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'];
Помните, чтобы сбросить переменные после завершения процесса, чтобы оптимизировать использование памяти.