【问题标题】:Ctrl+r in firefox for refreshing page and my php codeFirefox 中的 Ctrl+r 用于刷新页面和我的 php 代码
【发布时间】:2011-01-31 02:36:22
【问题描述】:

我已经创建了一个表单(所以它是 PHP 和 HTML 混合代码)。它有能力发送'$_POST'。当我点击它时,它可以完美地发送和显示输入。

但是当我在 firefox 中单击 Ctrl+R 以重新刷新页面时,发生了一些事情。我得到了这个确认对话框:“要显示这个页面,Firefox 必须发送信息,以重复之前执行的任何操作(例如搜索或订单确认)

我的问题

  1. 这是什么,(这个确认对话框?)
  2. 我必须对我的代码做些什么才能抑制这个对话框?

【问题讨论】:

  • @all :感谢您提供所有答案。很抱歉,我只能接受这么多好的答案中的一个;(

标签: php html firefox


【解决方案1】:

提交表单(发送 POST 请求)通常用于在电子商务网站上确认订单。因此,提交两次将提交订单两次。因此,浏览器倾向于要求用户确认是否要再次发送 POST 请求。

为了防止这种情况,您需要使刷新执行 GET 请求而不是 POST 请求。为此,只需在处理完表单后重定向到同一页面。

header("Location: /path/to/self");

这样当用户点击刷新时,它将发送 GET 请求而不是 POST 请求,并且不会提示确认。


为了澄清,它是这样的:

  • 通过 POST 发送表单(用户点击表单)
  • 表单得到处理
  • 用户被重定向到同一页面(通过 GET)
  • 用户现在将刷新 GET 请求而不是 POST 请求。

【讨论】:

    【解决方案2】:

    我猜每当您的表单(php、asps、静态 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】:

      您可能已经创建了一个包含<form> 的HTML 页面。该表单用于将数据发送到 HTTP 服务器(即托管您网站的网络服务器)。

      HTTP 协议定义了用于向服务器发送数据和从服务器检索数据的不同请求类型。最常用的是GETPOST。如果您想成为一个非常糟糕的 PHP 程序员,那么您必须了解所有这些,不幸的是(或者幸运的是,如果您是黑客方面的)非常普遍。

      您的问题是 Firefox 在发送 POST 请求后到达了您正在谈论的页面。如果您重新加载页面,它必须以 POST 的形式再次发送相同的数据。由于 POST 请求应该用于什么的约定(通常用于修改数据库上的数据),浏览器会询问用户是否确定自己想要做什么。

      主要有两种方法可以规避这一点:

      1. 将表单方法改为GET;或
      2. 在 POST 之后使用重定向。

      要使用第一种方法,您可以简单地将method="get" 参数添加到您的表单标签:

      <form action="senddata.php" method="get"> ... </form>
      

      要使用第二种方法,您只需在 POST 请求之后重定向用户,使用类似

      header("Location: blahblahblah")
      

      最常用的模式是POST-Redirect,也就是我告诉你的第二种方法。使用 GET 更改数据库上的数据有许多安全隐患(如果您对此感兴趣,您应该像每个 PHP 程序员一样阅读有关 XSRF)。

      【讨论】:

      • 非常完整和详细的答案。确实如此完整,以至于我对没有提及 POST-Redirect 模式的 HTTP 303 状态代码 (w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.3.4) 的适当性感到惊讶:“此方法的存在主要是为了允许 POST 激活的输出将用户代理重定向到选定资源的脚本。"
      • 非常感谢。您的回答甚至提供了我不问但我真的需要知道的微妙信息:关于最常用的模式是 POST-Redirect ;D
      【解决方案4】:

      如果表单提交成功,回复status code 303

      header('Location: http://www.example.com/', TRUE, 303);
      

      这会强制浏览器对结果页面使用 GET 请求。重新加载不会发送任何 POST 数据,也不会显示弹出窗口。

      【讨论】:

        猜你喜欢
        • 2014-02-06
        • 2011-10-10
        • 2011-07-30
        • 1970-01-01
        • 1970-01-01
        • 2018-05-26
        • 2014-07-14
        • 1970-01-01
        • 2011-03-15
        相关资源
        最近更新 更多