返回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)模式 。
在您发布的脚本中发送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以优化内存使用情况。