У меня есть приложение PHP со страницей, которая имеет форму для поиска данных. Когда я нажимаю на кнопку поиска, появляется страница Sumbit с методом HTTP POST. В этот момент я нажимаю на один элемент в списке результатов и перехожу на другую страницу. Если я нажимаю кнопку «Назад» в браузере на новой странице, я получаю ошибку «Срок действия документа истек». Зачем? Что я могу попытаться решить эту проблему?
Вот схематическое резюме:
СТРАНИЦА A -> HTTP Post Отправить на СТРАНИЦУ A -> СТРАНИЦУ B -> ВЕРНУТЬСЯ НА СТРАНИЦУ A -> ОШИБКА
Заранее спасибо.
По сути, вы не хотите, чтобы запрос пользователя завершался, когда он POST
данные на HTML-страницу. Вы должны перенаправить их на GET
страница, поэтому их браузер рассматривает это как свое последнее известное местоположение, как перенаправления обрабатываются как часть общего запроса в браузерах.
// receive $_POST
// ... do work ...
// success!
header('Location: /wherever', true, 302);
Found
для этого обычно используется метод, позволяющий переходить от одного глагола к другому (хотя часто используются и другие глаголы, например, 303, но … да, просто используйте 302)
Это должно решить вашу проблему!
Примечание: В этом конкретном случае особенно полезны такие вещи, как сессии Flash. Вы хотите, чтобы данные следовали за ними на перенаправленной странице, поэтому вы можете сказать: «О, вы вошли!» или что угодно. Это их цель. Есть несколько способов убить этого зверя, но я просто хотел, чтобы ты знал.
Side Note ++Другие пользователи упоминали об этом, но это стоит повторить. Хотя вышеперечисленное решает вашу проблему, стандартным соглашением для форм поиска является использование GET
<form method="get" action="/search">
<input name="q">
<button type="submit">Search</button>
</form>
Это сделано по нескольким причинам, но именно так, чтобы результаты поиска были индексируемыми, закладками и общими.
POST
обычно зарезервирован для больших двоичных объектов данных или для конфиденциальных типов данных. Существуют и другие варианты использования, такие как глаголы REST и т. Д., Но я слишком упрощаю вопрос.
К этому моменту обязательно urldecode($_GET)
ваши данные.
Других решений пока нет …