**背景信息:感谢bruce(sqlwork.com)提供的出色解释。
此网页需要您先前输入的数据才能正确显示。您可以再次发送这些数据,但这样将重复此页面以前执行的任何操作。单击“重新加载”以重新发送该数据并显示此页面。
由于网络开发人员的代码实践不规范,浏览器不得不添加此消息。场景如下:
1)用户填写表单并提交(发布表单)
2)服务器处理帖子数据并响应一个新页面(确认),标记为不可缓存
3)用户导航到新页面。
4)用户按回退:
对于浏览器来说,在步骤2中显示页面,因为其标记为无缓存,它必须从服务器请求它,换句话说,重新发布数据(执行步骤1)。在这里,编码不规范,如果这是信用卡收费,并且服务器上没有重新发布检测,则会收取两次费用。这是一个(仍然存在)非常普遍的问题,以至于浏览器不得不检测它并警告用户。
最佳修复方法在第二步,服务器向确认页面发送重定向。然后,当用户通��历史记录或后退访问确认页面时,它是一个获取请求,而不是一个发布请求,将不显示警告。
注意:Web表单的后台模型容易出现此问题。还要避免服务器传输。
我的解决方案
$_SESSION ['home']用于存储主页上的任何错误。
$_SESSION ['tempEmail']用于在php表单上回显值。
注意:为了进行错误处理,每个具有HTML表单的页面使用一个唯一的会话变量,并且用于在HTML表单上回显任何值的每个会话变量。
<?php
session_start();
if(!isset($_SESSION['home'])) {
$_SESSION['home']="";
$_SESSION['tempEmail']="";
}
可选 - 如果已登录,则将电子邮件地址分配给 $_SESSION['tempEmail'] 变量(如果以前未完成)以预填充 HTML 表单。
if(isset($_POST['Submit'])){
---your code---
$_SESSION['home'] = "Email and Password do not match, please try again.";
header("Location: " . $_SERVER['REQUEST_URI']);
$_SESSION['home'] = "Email address format is invalid. Please recheck.";
header("Location: " . $_SERVER['REQUEST_URI']);
unset ($_SESSION['home']);
header ("location: nextpage.php");
---or---
header("Location: " . $_SERVER['REQUEST_URI']);
}
?>
<body>
错误提示框
<span><strong class="error"><?php echo $_SESSION['home'] ?></strong></span>
HTML表单
<form action="#" name="loginform" method="post" >
<input type="text" name="userEmail" maxlength="50" title="Enter Your email" autocomplete="off" value="<?php echo htmlspecialchars($_SESSION['tempEmail']); ?>" placeholder="enter email" required/>
<input type="submit" name="Submit" value="Submit">
</form>
</body>
不建议在支付页面使用,详情请参见上面的讨论。已在Firefox、Chrome、Safari和IE9中进行了测试。使用返回按钮时,烦人的消息已经消失。确保在您的php脚本或php.ini中打开输出缓冲以避免头部警告。您可以检查您的php.ini文件是否包含以下内容;
output_buffering=On