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

时间:2013-02-23 02:15:23

标签: php google-chrome

在处理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 个答案:

答案 0 :(得分:10)

这似乎是Chrome 25中的一个错误。我使用Chrome 24在虚拟框中对其进行了测试,并更新为Chrome 25。

Chrome 24 =>没有对话

Chrome 25 =>对话框

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

答案 1 :(得分:0)

您可以尝试使用不同的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);
}

答案 2 :(得分:0)

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

答案 3 :(得分:-1)

这将有助于您更好的方式 把它放在任何包含所有文件的文件中

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

如果没有,请尝试这个

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