在处理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模式的人之外,没什么。
答案 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);