返回button重新提交表单数据($ _POST)

我的问题是,当上一页由表单创build时,后退button会导致浏览器发出类似于“Page expired”的内容。

例:

  • page1:与search条件一起提交的表单($ _POST请求,表单指向page2)
  • 第2页:接收$ _POST请求并显示结果(链接用户列表,指向第3页)
  • 第3页:显示用户configuration文件

现在,当访问者点击浏览器中的后退button时,会显示“Page expired”。

相反,前一页应该显示没有警告(第2页,用户列表)

你的策略如何绕过这个行为?

如果您正在提交search参数,您正在尝试获取一些数据,而不是修改一些。

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

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

  • 表单首先POST到第一页
    • 该页面执行一些操作(如将某些内容写入数据库)
    • 然后使用Location HTTP标头redirect到另一个页面。
  • 这是最后一页,这是浏览器使用GET请求进行的查询,显示从URL中收到的参数中获取的数据。

请参阅wikipedia上的Post / Redirect / Get页面。

使用Post / Redirect / Get (PRG)模式 。

PRG模式

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

不要使用POST进行search。 search可以安全地使用GET完成,因为它不会改变任何东西。

这适用于PHP和IE8。

不仅要将caching设置为私有,而且必须删除4个caching标头,而且只能使用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"); 

你可以使用会话来做到这一点。

例如。

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

记住在完成该过程之后取消设置variables以优化内存使用情况。