返回:文档过期/缓存丢失

时间:2016-04-13 10:21:33

标签: php caching

我知道这篇文章有many duplicates,但这些都没有提供解释性答案,更多的是一堆代码。我想更好地了解正在发生的事情。

我有一系列页面,用户在每页上填写信息。但是,我希望他们能够返回上一页编辑详细信息 - 不会出现文档过期/缓存丢失错误。我知道这是由POST造成的,因为服务器需要发布信息,因此需要重新发送。但我不了解给定的解决方案。

上面的答案提出了这个问题:

if ('GET' == $_SERVER['REQUEST_METHOD']) {
   //display view
}
else if ('POST' == $_SERVER['REQUEST_METHOD']) {
   //process input
   //update session
   header('Location: /next/page/to/view', true, 303);
}

但这是做什么的?我一直在阅读GET和POST,但仍然不了解这是做什么的,也不知道我应该如何使用它。我当前的页面使用SESSION,例如在第2页上,在第1页上提交表单后:

if (isset($_POST['input'])) {
  $input = $_POST['input'];
  $_SESSION['example'] = $input;
}

然后在第3页:

if (isset($_POST['otherinput'])) {
  $otherinput = $_POST['otherinput'];
  $_SESSION['otherexample'] = $otherinput ;
}
if (isset($_SESSION['example'])) {
  $input = $_SESSION['example'];
}

但正如所说的那样,在返回时不会工作,用户无需刷新页面。如何使用建议的解决方案,还请解释正在发生的事情。我在这里学习,但不幸的是,许多答案只是提供一些代码而且就是这样。我也喜欢解释!

编辑。我也发现这有效,但在这种情况下我也不明白为什么。我需要进一步解释。什么是最好的方式?

<?php
session_cache_limiter('private');
session_start();
header('Content-Type:text/html; charset=utf-8');
?>

1 个答案:

答案 0 :(得分:1)

马丁的评论是对的,但我会详细说明一下。

让我们考虑以下示例:第1页上有一个表单,通过POST提交到第2页.Page 2显示结果和指向第3页的链接.Page 1还有一个指向第4页的链接,这只是空的。

现在,让我们看看当点击第1页上的链接时会发生什么。

  • 浏览器显示第1页。他通过使用GET请求获得了它。
  • 您单击该链接,浏览器将执行第4页的另一个GET请求
  • 如果单击后退按钮,浏览器将查看其历史记录中的最后一页。它使用GET请求得到它,因此它假定它必须是静态数据。没有问题回去,一切都很好。

但是当您在第2页和第3页提交数据时会发生什么?

  • 浏览器显示第1页
  • 您在表单中输入数据并通过POST提交
  • 显示第2页,然后单击链接以检索第3页
  • 现在,当点击后退按钮时,浏览器会再次查看其历史记录。它显示了第2页,但它是通过POST获得的。这意味着你采取了可能改变某些行为的行动。第2页必须是动态的,因此只能通过再次发送完全相同的数据来恢复它。在没有用户主动想要的情况下发送数据不被认为是一种好的做法,因此浏览器会询问用户是否应该再次发送数据。所有浏览器的问题都不同。在某些情况下,更像是&#34;再次发送?&#34;和其他人更像是&#34; naa,你不想再这样做。该行动已经过期了。相信我。&#34;。

那么,您可以做什么来显示页面而不再发送数据并触发警告?当浏览器接收到该站点重新定位的信息(http状态301和302)时,它将新URL保存在其历史记录中而不是旧记录中。我们将通过执行我们需要对发布的数据执行的所有操作来使用此功能,然后将浏览器重定向到其他网址。浏览器将执行GET请求以获取新页面。因此,当您单击后退按钮时,GET请求将记录在浏览器的历史记录中,而不是POST请求中。所以没有发出警告。

我希望这是可以理解的;)