17

所以这是交易,我使用 HTML 表单在页面之间传输变量,并使用 PHP 脚本根据提交的值创建页面。一般来说,它看起来像这样:从项目目录中选择所需的内容,下一页显示此特定项目的详细信息。一切都很完美,除了一件事:

每当我使用浏览器的后退按钮时,我总是收到错误: ERR_CACHE_MISS,我需要刷新页面,然后确认我真的要重新提交数据。

有什么办法可以解决这个问题,所以我的客户可以按照他们应该的方式使用后退按钮。

以下是浏览器提供给我的全文:

此网页需要您之前输入的数据才能正确显示。您可以再次发送此数据,但这样做会重复此页面之前执行的任何操作。重新加载此网页。按重新加载按钮重新提交加载页面所需的数据。错误代码:ERR_CACHE_MISS

4

6 回答 6

29

当您使用 php 或任何其他数据发布表单时,您可能会返回该页面并在浏览器中找到一条消息,例如“文档已过期”或“使用 Chrome 确认表单重新提交”。这些消息是浏览器对敏感数据(如发布变量)使用的安全预防措施。浏览器不会再次自动为您提供新页面。您必须通过单击重试或刷新页面来重新加载页面。然后,它会按照您的预期运行。

但是,php 编码器可以通过在脚本中添加一些代码来解决来自浏览器的烦人消息。该示例显示了可以在 session_start() 之上添加的几行代码,以便在您发布时能够在没有任何挂断的情况下来回返回页面。“private_no_expire”模式意味着客户端将不会收到首先过期的标头。

header('Cache-Control: no cache'); //no cache
session_cache_limiter('private_no_expire'); // works
//session_cache_limiter('public'); // works too
session_start();
于 2014-11-29T06:20:43.180 回答
9

**一些背景:感谢 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
于 2013-11-08T04:47:18.570 回答
8

我发现只使用:

header('Cache-Control: no cache'); //disable validation of form by the browser

解决问题

于 2016-05-05T09:42:44.830 回答
4

我试过这个答案,没关系。你必须把这段代码放在之前: session_start():

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

祝你好运

于 2015-10-28T11:26:11.463 回答
3

其他答案都不适合我。

  • 我不想重定向
  • 设置不同的标题不起作用
  • 我已经在我的帖子中使用了令牌以确保不会发生重新提交
  • 我发布到表单显示的相同网址

这个简单的 javascript 解决了我的后退按钮抛出“ERR_CACHE_MISS”的问题

if ( window.history.replaceState ) {
  window.history.replaceState( null, null, window.location.href );
}
于 2019-07-24T09:24:51.027 回答
0
<?php
if(isset($_POST['submit']))
{
 //submission goes here
}
?>

这是你在想的吗?

编辑 - SQL 确实是一个很好用的东西,我看到它被添加为评论中的推荐,如果可以的话,我同意使用 SQL,它快速、直观和高效。

于 2013-10-07T00:57:40.127 回答