代码之家  ›  专栏  ›  技术社区  ›  Greg

为什么Chrome即使在我使用PRG模式时也会发出“确认表单重新提交”?

  •  7
  • Greg  · 技术社区  · 11 年前

    在处理POST请求后,我正在做一件非常标准的事情,即重定向到同一页面,这样用户在重新加载页面时就不会收到“确认表单重新提交”(或等效的)对话框。

    我使用的是303响应状态代码。

    这是代码:

    header( "HTTP/1.1 303 See Other" );
    header( "Location: " . $_SERVER['REQUEST_URI'] );
    exit();
    

    这在Safari和FF中可以正常工作。Chrome会弹出“确认表单重新提交”对话框。

    在Chrome中,我可以使用网络检查器来查看303重定向是否确实发出,并且在我的初始POST之后有一个GET。

    然而,如果我试图在那一点上重新加载页面,我会得到“确认表单重新提交”。

    如果我通过添加虚假的查询参数来修改URL,则不会发生这种情况。那就是。。。

    header( "HTTP/1.1 303 See Other" );
    header( "Location: " . $_SERVER['REQUEST_URI'] . '?foo' );
    exit();
    

    …工作得很好。

    Chrome是不是太聪明了,缩短了同一页面的重新加载时间?还是这是一个已知的问题?我花了一些时间环顾四周,但除了一百万人只需要使用PRG模式之外,什么都没有。

    4 回复  |  直到 11 年前
        1
  •  10
  •   Oliver    11 年前

    这似乎是Chrome 25中的一个错误。我用Chrome24在virtualbox中测试了它,并更新到了Chrome25。

    铬24=>无对话框

    铬25=>对话

    也许你应该提交一个bug。:-)

        2
  •  0
  •   J_z    11 年前

    您可以尝试将代理重定向到具有不同URI的脚本

    if ($_SERVER['REQUEST_METHOD'] == 'POST') {
          header('Location: proxy.php?uri='.$_SERVER['REQUEST_URI'], true, 303);
    }
    

    然后回来

    # proxy.php
    
    if (!empty($_GET['uri'])) {
        // maybe some validation here
        header('Location: '.$_GET['uri'], true, 303);
    }
    
        3
  •  0
  •   Yossarian    11 年前

    当用户试图恢复意外关闭的页面时,浏览器将显示此错误“err_cache_miss”。观看视频证明错误的主要来源 https://www.youtube.com/watch?v=6c9ztzqlthE

        4
  •  -1
  •   Darkcoder    8 年前

    这将帮助你更好 只需将其放在包含所有文件的任何文件中

    header("Cache-Control: no-cache, must-revalidate");
    

    如果没有,那就试试这个

    session_cache_limiter('private, must-revalidate');
    session_cache_expire(60);