7

处理 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

4 回答 4

10

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

Chrome 24 => 没有对话框

Chrome 25 => 对话框

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

于 2013-02-23T02:58:32.050 回答
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);
}
于 2013-02-23T22:09:32.313 回答
0

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

于 2013-11-12T13:22:51.053 回答
-1

这将帮助您以更好的方式将其放入包含所有文件的任何文件中

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

如果没有,那么试试这个

session_cache_limiter('private, must-revalidate');
session_cache_expire(60);
于 2017-01-19T10:34:55.213 回答