Ответ 1
Я знаю, что этот вопрос старый, но, имея эту проблему, две строки, которые я обнаружил, работают:
header("Cache-Control: no cache");
session_cache_limiter("private_no_expire");
Я искал много сообщений здесь и в других местах, но не могу найти решение моей проблемы. У меня есть страница, которая отображает записи базы данных: database.php. Эти записи могут быть отфильтрованы с помощью формы. Когда я их фильтрую и показываю только те, которые меня интересуют, я могу щелкнуть запись (как ссылку), которая приведет меня к этой странице записей (через php GET). Когда я нахожусь на этой странице записей (т.е. "View.php? Id = 1" ) и нажимаю кнопку "Назад" (back to database.php), форма фильтра требует подтверждения повторной отправки формы. Есть ли способ предотвратить это?
Вот некоторые (упрощенные) примеры кода:
database.php:
<form>
<select>
<option>1</option>
<option>2
<option>
</select>
<input type="submit" name="apply_filter" />
</form>
<?php
if ( isset( $_POST[ "apply_filter" ] ) ) { // display filtered entries
$filter = $_POST[ "filter" ];
$q = "Select * from table where col = '" . $filter . "'";
$r = mysql_query( $q );
} else { // display all entries
$q = "Select * from table";
$r = mysql_query( $q );
}
while ( $rec = mysql_fetch_assoc( $r ) ) {
echo "<a href='view.php?id=" . $rec[ "id" ] . "'>" . $rec[ "name" ] . "</a><br />"; // this is where the link to the view.php page is...
}
?>
Теперь, как уже упоминалось, если я нажму ссылку, это приведет меня к "view.php? id = whatever". На этой странице я просто получаю идентификатор от URL-адреса, чтобы отобразить эту единственную запись:
view.php:
<?php
$id = $_GET[ "id" ];
$q = "Select * from table where id = '" . $id . "'";
$r = mysql_query( $q );
while ( ) {
// display entry
}
?>
Если я сейчас нажал кнопку "Назад", форма в файле database.php(тот, который используется для фильтрации результатов БД) требует подтверждения для повторной отправки. Не только это очень раздражает, но и бесполезно для меня.
Как я могу это исправить? Надеюсь, что примеры кода и объяснение моей проблемы достаточно. Если не дайте мне знать, и я попытаюсь указать.
Я знаю, что этот вопрос старый, но, имея эту проблему, две строки, которые я обнаружил, работают:
header("Cache-Control: no cache");
session_cache_limiter("private_no_expire");
Есть два способа, которыми я знаю это. Простой способ и трудный путь.
Независимо от того, когда вы работаете с государственной страницей (используя $_SESSION
), которую вы должны делать, чтобы ваши страницы "живы" и под вашим контролем, предотвращает кеширование всех страниц, таких как это:
<?php
//Set no caching
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
?>
Трудный способ включает в себя создание идентификатора и сохранение его где-то на странице в виде скрытого ввода или cookie &_SESSION
. Затем вы сохраняете один и тот же идентификатор на сервере как $_SESSION
. Если они не совпадают, серия запрограммированных инструкций типа if
else
ничего не происходит, поскольку страница повторно отправляется (это то, что она пытается сделать, когда вы нажимаете на нее).
Простым способом является просто перенаправить пользователя обратно на страницу отправки формы, если форма была успешно отправлена, например:
header('Location: http://www.mydomain.com/redirect.php');
Надеюсь, это поможет!
Одна вещь, которая может помочь, заключается в том, чтобы ваша форма фильтра использовала метод GET
вместо POST
.
Браузеры обычно предотвращают автоматическую повторную отправку POST
ввода, чего не делают, когда используется вход GET
. Кроме того, это позволит пользователям ссылаться на вашу страницу с помощью фильтра.
Альтернативное решение, которое также работает, если/когда страница перезагружается, включает проверку оригинальности сообщения с помощью $_SESSION. Вкратце, проверьте уникальную или случайную строку.
В форме добавьте элемент ввода со значением, заданным с помощью rand() или microtime():
<input type="hidden" name="formToken" value="<?php echo microtime();?>"/>
Затем заверните функцию PHP для проверки и анализа данных формы в блоке if:
if(!isset($_SESSION['formToken']) || $_POST['formToken'] !== $_SESSION['formToken'])){
$_SESSION['formToken'] = $_POST['formToken'];
/*continue form processing */
}
Я использовал ответ в разделе Как определить, попал ли пользователь на страницу с помощью кнопки "Назад"? чтобы определить, было ли посещение вызвано нажатием кнопки "Назад" в браузере, а затем, если это так, я использовал JavaScript для перезагрузки страницы. Когда страница перезагружается, мой код уже обрабатывает соответствующие проверки, чтобы убедиться, что форма никогда не отправляется дважды. Важной частью в моем случае было принудительное обновление страницы при повторном посещении формы после нажатия кнопки "Назад" в браузере. Это мой код в URL, где я хотел применить эту проверку:
<script type="text/javascript">
if (window.performance && window.performance.navigation.type == window.performance.navigation.TYPE_BACK_FORWARD) {
location.reload();
}
</script>
заголовок ("Cache-Control: нет кеша");
session_cache_limiter ( "private_no_expire");
ПРИМЕЧАНИЕ. После использования данных публикации, отправленных вами из формы, эти две строки следует использовать в конце function.so, когда мы вернемся к перенаправленной странице, она не попросит вас повторно отправить страницу. Это будет работать
Вам нужно удалить запрос, который POST
данные из истории браузера
history.replaceState("", "", "/the/result/page")
См. этот ответ
Также вы можете следовать шаблону Post/Redirect/Get
.