是什么、为什么、怎么办

"ERR_CACHE_MISS" 错误通常发生在你使用浏览器的“返回”按钮时。这种错误与浏览器处理缓存数据的方式有关,特别是在处理表单和POST请求时。

常见原因

1. 表单重新提交

  • 当你导航回包含表单提交的页面(通常是POST请求)时,Chrome可能会提示你重新提交表单。如果表单数据不再存在于缓存中,浏览器无法自动重新提交它,导致 "ERR_CACHE_MISS" 错误。

2. 缓存条目过期

  • 缓存的数据可能已经过期或损坏。当你尝试导航回某个页面时,必要的数据丢失,导致错误。

3. 特定网站问题

  • 某些网站缓存处理不当。如果一个网站的缓存头部配置有问题或它如何管理用户会话中的数据有问题,当你导航回该网站时可能会导致此错误。

4. 浏览器设置和扩展

  • 某些设置或扩展可能会干扰Chrome的缓存和导航功能,导致此错误。

5. 网络问题

  • 临时网络问题也可能导致Chrome无法从缓存中检索所需的数据,从而产生错误。

6. 服务器端问题

  • 服务器端问题也可能导致Chrome在尝试获取数据时响应不正确,导致错误。

技术解释

  • HTTP请求和缓存:当你使用POST请求提交表单时,服务器处理请求并返回响应。通常,浏览器不会缓存POST请求的响应以确保安全。当你返回包含POST请求的页面时,Chrome需要重新提交数据以获取页面。如果数据丢失或无法重新提交,就会触发 "ERR_CACHE_MISS" 错误。

  • 缓存控制头:网站可以使用 Cache-Control 头来指定其内容的缓存方式。如果这些头配置不当,会导致缓存问题,从而触发此错误。

解决方法

  • 网站开发者:确保适当的缓存控制头并以不需要重新提交表单的方式处理表单提交。

  • 浏览器用户:遵循前面提到的故障排除步骤,清除缓存,禁用问题扩展,并保持浏览器更新。

    1. 避免在提交表单后使用返回按钮
    • 尽量在网站内导航时避免在提交表单后使用浏览器的返回按钮。
    2. 使用地址栏历史记录
    • 点击并按住Chrome中的返回按钮,可以查看浏览历史记录。选择你想返回的页面,而不是直接点击返回按钮。
    3. 使用书签
    • 在提交表单之前为重要页面添加书签,这样可以在不触发表单重新提交的情况下轻松返回这些页面。
    4. 清除浏览器缓存
    • 清除浏览器缓存和Cookie以防止由于旧数据导致的重新提交问题。
    • 打开Chrome。
    • Ctrl + Shift + Del 打开“清除浏览数据”菜单。
    • 选择“缓存的图片和文件”以及其他你想清除的数据。
    • 点击“清除数据”。

服务器解决方案

1.使用 Cache-Control: private 的解决方案

设置 Cache-Control: private 头可以帮助解决表单重新提交错误,因为它指示浏览器以用户特定的方式缓存页面数据,避免共享缓存带来的问题。当用户导航回页面时,浏览器可以从其私有缓存中提取页面,而不是重新提交表单数据。

// PHP
header("Cache-Control: private, max-age=0, no-store, no-cache, must-revalidate");
header("Pragma: no-cache"); // 兼容 HTTP/1.0
// nodejs
app.use((req, res, next) => {
res.setHeader('Cache-Control', 'private, max-age=0, no-store, no-cache, must-revalidate');
res.setHeader('Pragma', 'no-cache'); // 兼容 HTTP/1.0
next();
});

什么是 Cache-Control: private

Cache-Control 头用于指定缓存机制的指令,可以应用于请求和响应。当你设置 Cache-Control: private 时,你是在告诉浏览器将响应存储为用户专用的内容,不应由共享缓存(如代理服务器或CDN)存储。

Cache-Control: private 如何帮助防止表单重新提交错误

  • 用户专用缓存

当响应被标记为 private 时,浏览器知道这些数据是为单个用户准备的,不应与其他用户共享。这确保了表单提交的敏感数据被更安全地处理。这种指令可以帮助避免不必要的表单重新提交,确保当用户返回时,浏览器可以依赖其缓存版本,而不需要重新提交表单数据。

  • 优化返回导航

使用 Cache-Control: private,当用户返回到之前访问的页面时,浏览器可以从自身缓存中提供该页面的缓存版本,而不需要重新提交表单数据。这使得导航更加顺畅,并防止浏览器需要重新处理表单提交,导致 "ERR_CACHE_MISS" 错误。

额外的好处

  • 安全性:使用 Cache-Control: private 确保敏感信息不存储在共享缓存中,避免被其他用户访问。

  • 性能:虽然私有缓存没有公共缓存那么积极,但它仍然允许浏览器重用之前获取的数据,改善用户体验,减少后续访问的加载时间。

缺点

  • 缓存效率降低:由于代理服务器和CDN不能缓存这些响应内容,服务器可能会接收到更多的请求,增加负载。

  • 性能影响:对于一些公共内容,不使用共享缓存可能会增加页面加载时间,因为每次请求都需要从服务器获取内容。

2. PRG模式(Post/Redirect/Get)

实现 Post/Redirect/Get 模式来避免表单重新提交问题。在处理完表单提交后,使用 HTTP 303 See Other 状态码重定向用户到一个新页面。这将把 POST 请求转换为 GET 请求,可以安全地加书签或导航返回。

// PHP 示例
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
// 处理表单数据
// ...
header("Location: /form-submitted-successfully");
exit;
}

3. JavaScript/AJAX 表单提交

<form id="myForm">
<!-- 表单字段 -->
</form> <script>
document.getElementById('myForm').addEventListener('submit', function(event) {
event.preventDefault();
const formData = new FormData(this);
fetch('/submit-form', {
method: 'POST',
body: formData
}).then(response => {
if (response.ok) {
// 处理成功响应
} else {
// 处理错误响应
}
}).catch(error => {
console.error('表单提交失败:', error);
});
});
</script>

4. 表单令牌模式

实现一个唯一的令牌用于每次表单提交,以确保每次提交仅被处理一次。将令牌存储在会话中并在表单提交时进行验证。

session_start();

// 生成唯一令牌
if (!isset($_SESSION['form_token'])) {
$_SESSION['form_token'] = bin2hex(random_bytes(32));
} // 在表单中包含令牌
echo '<input type="hidden" name="form_token" value="'.$_SESSION['form_token'].'">'; // 在表单提交时验证令牌
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
if (!isset($_POST['form_token']) || $_POST['form_token'] !== $_SESSION['form_token']) {
// 无效令牌,拒绝提交
exit('Invalid form submission');
} // 处理表单数据
// ... // 生成新令牌以防止重新提交
$_SESSION['form_token'] = bin2hex(random_bytes(32));
}

Chrome使用回退,出现表单提交失败,ERR_CACHE_MISS问题的更多相关文章

  1. WP Mail SMTP插件解决Contact Form 7表单提交失败问题

    WP Mail SMTP插件解决Contact Form 7表单提交失败问题 WP Mail SMTP是一款非常优秀的解决WordPress主机因为不支持或者是禁用了mail()函数,导致无法实现在线 ...

  2. php中max_input_vars默认值为1000导致多表单提交失败

    公司内一个php的后台管理系统,之前运行在apache上,后来我给转到nginx+php上后,其他功能运行正常,有一个修改功能提交表单后没有提交成功,查了代码没查出来什么问题,后来看了下php err ...

  3. form表单提交失败

    在使用一个登录/注册模板的时候,发现form表单不了,但是删除模板引用的js后就正常了,查看js文件的源码,有一个 const firstForm = document.getElementById( ...

  4. yii2表单提交CSRF验证

    Yii2表单提交默认需要验证CSRF,如果CSRF验证不通过,则表单提交失败,解决方法如下: 第一种解决办法是关闭Csrf public $enableCsrfValidation = false; ...

  5. form表单验证失败,阻止表单提交

    form表单验证失败,阻止表单提交 效果演示: 贴上完整代码: <!DOCTYPE html> <html lang="en"> <head> ...

  6. 基于Http原理实现Android的图片上传和表单提交

    版权声明:本文由张坤  原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/794875001483009140 来源:腾云阁  ...

  7. golang-web框架revel一个表单提交的总结

    这里要介绍好是revel框架的表单post提交的列子,主要是用于入门学习,和一些知识点的讲解: 首先: 来了解一个问题那就是重复提交表单,做过form表单提交的同学都知道,如果表单提交后不做处理,那么 ...

  8. 原生JS 表单提交验证器

    转载:http://www.cnblogs.com/sicd/p/4613628.html 一.前言 最近在开发一个新项目,需要做登陆等一系列的表单提交页面.在经过“缜密”的讨论后,我们决定 不用外部 ...

  9. 浏览器下载/导出文件 及jQuery表单提交

    1 比如以下按钮, 用于导出文件,如EXCEL文件. <li> <button class="whiteBg btn2" onclick="doExp( ...

  10. Form表单提交数据的几种方式

    一.submit提交 在form标签中添加Action(提交的地址)和method(post),且有一个submit按钮(<input type='submit'>)就可以进行数据的提交, ...

随机推荐

  1. Java类和对象 小白版

    一.类 一.类的定义 具有同种属性的对象称为类.定义了它所包含的全体对象的公共特征和功能,对象就是类的一个实例化. 类的三种常见成员:属性.方法.构造器 二.类的编写 1.类名的定义: 2.类属性(特 ...

  2. Sealos 就是小团队的神器

    作者:阳明.Kubernetes 布道师,公众号 K8s 技术圈主理人 最近我们新开发了一个项目 fastclass.cn,这个项目是一个独立开发者的学习网站,我们的目标是帮助你使用 Figma.Py ...

  3. C语言之父和Linux之父谁更伟大?

    前言 在计算机软件领域,做出过重大贡献的神人很多,比如:<计算机程序设计艺术>(The Art of Computer Programming)一书的作者- Donald Knuth:Pa ...

  4. T113s工业套件简述

    T113s工业套件简述 提示 T113开发交流QQ群:120575746 此开发板的任何问题都可以在我们的论坛交流讨论 https://forums.100ask.net/c/aw/ 硬件简述​ 10 ...

  5. 官网使用conda&pip安装PyTorch命令总结(包含各版本)

    原网页https://pytorch.org/get-started/previous-versions/ 因为有时访问该网站比较慢,所以本博客记录该网页内容 Installing previous ...

  6. 初三年后集训测试---T1排序

    初三年后集训测试 $T 1 $ 排序 $$HZOI$$ ·题意: 给定 \(4n\) 个整数,求 : \[\max\{\sum_{i=1}^{4n}(A_{i,1} \times A_{i,2} - ...

  7. 从日志记一次Spring事务完整流程

    spring事务一次完整流程,创建 >确认获取连接 >完成 >提交>释放链接 DataSourceTransactionManager //Step1. 进入业务方法前,依据事 ...

  8. 【YashanDB知识库】汇聚库23.1环境发生coredump

    [标题]汇聚库23.1环境发生coredump [问题分类]数据库错误 [关键词]YashanDB, 汇聚库, coredump [问题描述]在23.1.1.200版本数据库环境创建dblink.视图 ...

  9. 【YashanDB知识库】yac修改参数后关闭数据库hang住

    [标题]yac修改参数后关闭数据库hang住 [问题分类]性能优化 [关键词]YashanDB, yac, shutdown hang [问题描述]修改yac参数后执行shutdown immedia ...

  10. ubuntu 20.04安装GCC G++ 6.2,支持c++ 14

    1. 下载源码包 wget http://ftp.gnu.org/gnu/gcc/gcc-6.2.0/gcc-6.2.0.tar.bz2 2. 解压 tar jxf gcc-6.2.0.tar.bz2 ...