**一些背景:感谢 bruce (sqlwork.com) 的出色解释。
此网页需要您之前输入的数据才能正确显示。您可以再次发送此数据,但这样做会重复此页面之前执行的任何操作。按重新加载以重新发送该数据并显示此页面。
由于 Web 开发人员草率的编码实践,浏览器被迫添加此消息。场景如下:
1)用户填写表单并提交(发布表单) 2)服务器处理发布数据并响应标记为不可缓存的新页面(确认) 3)用户导航到新页面。4)用户按回:
为了让浏览器在步骤 2 中显示页面,因为它标记为 no-cache,它必须从服务器请求它,换句话说,重新发布数据(执行步骤 1)。这是草率的编码,如果这是信用卡收费,并且服务器上没有重新检测,则对该卡收费两次。这是一个非常普遍的问题,浏览器必须检测到这一点并警告用户。
最好的解决方法是在第二步中,服务器将重定向发送到确认页面。然后当用户通过历史或返回访问确认时,它是一个获取请求,而不是一个发布请求,并且不会显示警告。
注意:webform 的回发模型适合这个问题。也避免服务器转移。
我的解决方案
$_SESSION['home'] 用于在主页上存储任何错误。
$_SESSION['tempEmail'] 用于在 php 表单上回显值。
注意:为每个具有 HTML 表单的页面使用一个唯一的会话变量以进行错误处理,并为在 HTML 表单上回显的每个值使用任何会话变量。
<?php
session_start();
//Initialize variables not initialized without overwriting previously set variables.
if(!isset($_SESSION['home'])) {
$_SESSION['home']="";
$_SESSION['tempEmail']="";
}
可选 - 如果已登录,请将电子邮件地址分配给 $_SESSION['tempEmail'] 变量(如果之前未完成)以预填写 HTML 表单。
if(isset($_POST['Submit'])){
---your code---
//Error message(s) examples
$_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']);
//success
unset ($_SESSION['home']); //optional, unset to clear form values.
header ("location: nextpage.php");
---or---
header("Location: " . $_SERVER['REQUEST_URI']); //re-post to same page with the $_SESSION['home'] success message.
}
?>
<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