我创建了一个表单(因此它是PHP和HTML混合代码)。它有能力发送'$ _POST'。当我点击它时,它完美地发送和显示输入。
但是当我在firefox中单击 Ctrl + R 重新打印页面时,会发生一些事情。我得到了这个confim对话框:“要显示此页面,Firefox必须发送重复之前执行的任何操作(例如搜索或订单确认)的信息”
我的问题
答案 0 :(得分:6)
您可能已经创建了一个包含<form>
的HTML页面。该表单用于将数据发送到HTTP服务器(即托管您站点的Web服务器)。
HTTP协议定义了用于将数据发送到服务器以及从服务器检索数据的不同请求类型。最常用的是GET
和POST
。如果你想成为一个非常糟糕的PHP程序员,你必须了解所有这些,不幸的是(或者幸运的是,如果你在黑客方面)非常普遍。
您的问题是Firefox在发送POST请求后已到达您正在讨论的页面。如果您重新加载页面,它必须以POST的形式再次发送相同的数据。由于关于POST请求应该用于什么的约定(通常用于修改数据库上的数据),浏览器会询问用户他是否确定他想要做什么。
主要有两种方法可以避免这种情况:
要使用第一种方法,只需在表单标记中添加method="get"
参数:
<form action="senddata.php" method="get"> ... </form>
要使用第二种方法,您只需在POST请求后使用类似
的内容重定向用户header("Location: blahblahblah")
最常用的模式是POST-Redirect,也就是我告诉你的第二种方法。使用GET更改数据库上的数据有很多安全隐患(如果您对此感兴趣,,您应该,因为每个PHP程序员应该,请阅读<强> XSRF 强>)。
答案 1 :(得分:3)
提交表单(发送POST请求)通常用于确认电子商务网站上的订单。因此,提交两次将提交订单两次。因此,浏览器倾向于要求确认用户想要再次发送POST请求。
为了防止这种情况,您需要使刷新执行GET请求而不是POST请求。为此,只需在处理表单后重定向到同一页面。
header("Location: /path/to/self");
当用户点击刷新时,它将发送一个GET请求而不是POST请求,并且不会提示确认。
要进行苛刻,就是这样:
答案 2 :(得分:2)
我猜每当你的表单(php,asps,static html等)包含可能形成字段infor或其他的帖子信息,通过firefox发送到服务器时,它会在再次向服务器发送数据之前显示这样的消息。它可以作为Mozilla开发人员的安全保护。我想它可以通过about:config禁用,但不建议这样做。
这也是正常行为。它应该是这样的,并且在firefox中已经存在了相当长的时间。
您可以在这里查看: http://forums.mozillazine.org/viewtopic.php?f=38&t=682835&st=0&sk=t&sd=a&hilit=Firefox+must+send
或者使用GET代替POST来发送数据......
此致
答案 3 :(得分:0)
如果表单已成功提交,请使用status code 303:
回答header('Location: http://www.example.com/', TRUE, 303);
这会强制浏览器对结果页面使用GET请求。重新加载不会发送任何POST数据,也不会显示弹出窗口。