阻止后退按钮显示POST确认警报

时间:2009-03-18 22:21:15

标签: php forms post http-headers

我有一个应用程序,它为网页提供了很长的参数列表,因此我必须使用POST而不是GET。问题是,当页面显示并且用户单击“后退”按钮时,Firefox会显示警告:

  

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

由于应用程序的构建方式使得返回是一种非常常见的操作,这对最终用户来说真的很烦人。

基本上,我想按照此页面的方式进行操作:

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

输入内容,提交,然后单击“上一步”按钮。没有警告,它只会回来。

谷歌搜索我发现这可能是Firefox 3中的一个错误,但我想以某种方式在他们“修复”它之后得到这种行为。

我想这可能对某些HTTP标头有用,但究竟是哪种?

6 个答案:

答案 0 :(得分:37)

请在此处查看我的网络编程黄金法则:

Stop data inserting into a database twice

它说:“永远不要用身体回应POST请求。始终执行工作,然后使用Location:标头进行响应以重定向到更新的页面,以便浏览器通过GET请求它“

如果浏览器曾要求用户重新发布POST,那么您的网络应用就会中断。用户不应该看到这个问题。

答案 1 :(得分:27)

一种方法是将POST重定向到重定向到GET的页面 - 请参阅Post/Redirect/Get on wikipedia

假设您的POST是4K的表单数据。据推测,您的服务器使用该数据执行某些操作,而不是仅将其显示一次并将其丢弃,例如将其保存在数据库中。继续这样做,或者如果它是一个巨大的搜索表单,则在数据库中创建它的临时副本,该数据库在几天后被清除,或者在使用空间限制时以LRU为基础。现在创建一个可以使用GET访问的数据表示。如果是临时的,请为其生成ID并将其用作URL;如果它是一组永久数据,它可能有一个ID或者可以用于URL的东西。在最坏的情况下,像小网址使用的算法可以将大网址折叠为更小的网址。重定向POST以获取数据的表示。


作为一个历史记录,这种技术是established practice in 1995

答案 2 :(得分:3)

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

答案 3 :(得分:2)

我一直在使用Session变量来帮助解决这种情况。以下是我使用的方法,这种方法多年来一直很适合我:

//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的变量中。但它帮助我跟踪哪些数据来自哪里。

答案 4 :(得分:1)

  

我有一个应用程序,它为网页提供了很长的参数列表,因此我必须使用POST而不是GET。问题是,当页面显示并且用户单击“后退”按钮时,Firefox会显示警告:

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

答案 5 :(得分:0)

作为另一种解决方案,您可以停止使用重定向。

您可以在没有POST确认提醒的情况下立即处理并呈现处理结果。您应该只是操纵浏览器历史记录对象:

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

请参阅fullshort答案