防止后退button显示POST确认警报

我有一个应用程序,提供一长串参数到一个网页,所以我必须使用POST而不是GET。 问题是,当页面显示,用户点击后退button,Firefox显示警告:

要显示此页面,Firefox必须发送信息,以便重复之前执行的任何操作(如search或订单确认)。

由于应用程序的构build方式使得返回是一个相当常见的操作,这对最终用户来说确实很烦人。

基本上,我想按照这个页面的方式来做:

http://www.pikanya.net/testcache/

input内容,提交,然后点击返回button。 没有警告,它只是回来。

谷歌search,我发现这可能是Firefox 3中的一个错误,但我想不知怎么得到这种行为,即使他们“修复”。

我想这可能是可以与一些HTTP头,但究竟是什么?

其中一种方法是将POSTredirect到一个redirect到GET的页面 – 参见Post / Redirect / Get on wikipedia 。

说你的POST是表单数据的4K。 据推测,你的服务器用这些数据做了一些事情,而不是只显示一次,扔掉它,比如把它保存在数据库中。 继续这样做,或者如果它是一个巨大的search表单,在数据库中创build临时副本,在使用空间限制后的几天或LRU基础上清除。 现在创build一个可以使用GET访问的数据表示。 如果是临时的,则为其生成一个ID并将其用作URL; 如果它是一个永久的数据集,它可能有一个ID或可以用于URL的东西。 在最糟糕的情况下,一个像小url使用的algorithm可以将一个较大的URL合并为一个更小的URL。 redirectPOST以获取数据的表示。


作为一个历史logging,这个技术在1995年被确立了 。

在这里看到我的networking编程的黄金法则:

停止向数据库中插入数据两次

它说:“永远不要回应一个机构的POST请求。 始终执行该工作,然后使用Location:标题进行响应,以redirect到更新的页面,以便浏览器使用GET“

如果浏览器询问用户关于重新POST,您的networking应用程序是坏的。 用户不应该看到这个问题。

避免这种警告/行为的一种方法是通过AJAX进行POST,然后将用户分别发送到另一个页面(或不发送)。

我一直在使用Sessionvariables来帮助在这种情况下。 以下是我使用的方法多年来一直为我工作的很好:

 //If there's something in the POST, move it to the session and then redirect right back to where we are if ($_POST) { $_SESSION['POST']=$_POST; redirect($_SERVER["REQUEST_URI"]); } //If there's something in the SESSION POST, move it back to the POST and clear the SESSION POST if ($_SESSION['POST']) { $_POST=$_SESSION['POST']; unset($_SESSION['POST']); } 

从技术上讲,你甚至不需要把它放回到名为$ _POST的variables中。 但它有助于我追踪哪些数据来自哪里。

我有一个应用程序,提供一长串参数到一个网页,所以我必须使用POST而不是GET。 问题是,当页面显示,用户点击后退button,Firefox显示警告:

你的推理是错误的。 如果请求没有副作用,则应该是GET。 如果有副作用,应该是POST。 select不应该基于您需要传递的参数的数量。

作为另一种解决scheme,您可能会停止使用redirect。

您可以立即处理并呈现处理结果,而不需要POST确认警报。 你应该只是操纵浏览器历史对象:

 history.replaceState("", "", "/the/result/page") 

查看完整或简短的答案