19

我的问题是,当前一页由表单创建时,后退按钮会导致浏览器说“页面已过期”。

例子:

  • page1:使用搜索条件提交的表单($_POST 请求,表单指向 page2)
  • page2:接收 $_POST 请求并显示结果(带有链接的用户列表,指向 page3)
  • page3:显示用户资料

现在,当访问者单击浏览器中的后退按钮时,它会显示类似“页面已过期”的内容。

相反,上一页应该显示没有警告(page2,带有用户列表)

您如何解决这种行为?

4

6 回答 6

23

如果您正在提交带有搜索参数的表单,那么您正在尝试获取一些数据,而不是修改一些数据。

因此,您应该使用 HTTP GET 方法,而不是 POST:当您打算创建/修改数据时应该使用 POST,而当您打算获取一些数据时应该使用 GET。

或者,如果您有一些必须完成的创建/修改操作:

  • 表单首先发布到第一页
    • 该页面执行一些操作(例如将某些内容写入数据库)
    • 然后使用LocationHTTP 标头重定向到另一个页面。
  • 最后一页,即浏览器使用 GET 请求进行的查询,显示从 URL 中接收的参数获取的数据。

请参阅 wikipedia 上的Post/Redirect/Get页面,了解这一点。

于 2010-01-27T11:34:54.090 回答
14

使用发布/重定向/获取(PRG) 模式

PRG模式

于 2010-01-27T11:33:38.867 回答
1

在您发布到的脚本中发送一个Location标题,指向后面的页面。

于 2010-01-27T11:31:10.183 回答
1

不要使用 POST 进行搜索。可以使用 GET 安全地完成搜索,因为它不会改变任何内容。

于 2010-01-27T11:35:48.060 回答
1

这适用于 PHP 和 IE8。

您不仅必须将缓存设置为私有,还必须删除 4 个缓存标头,这只能在 PHP 5.3 中完成。在 PHP 5.2 中,如果使用 Zend Framework 的 setHeader() 方法,您只能将 4 个标头设置为空白值。由于某种原因,在 IE8 上将 4 个标头值设置为空值是不够的。这是 PHP 5.3 的代码:

    header_remove("Expires");
    header_remove("Cache-Control");
    header_remove("Pragma");
    header_remove("Last-Modified");
于 2011-09-19T20:31:26.373 回答
0

您可以使用会话来执行此操作。

例如。

$_SESSION['name'] = $_POST['name'];

请记住在该过程完成后取消设置变量以优化内存使用。

于 2017-09-02T00:26:10.127 回答