HTTP 304错误的详细讲解
Not Modified 客户端有缓冲的文档并发出了一个条件性的请求(一般是提供If-Modified-Since头表示客户只想比指定日期更新的文档)。服务器告诉客户,原来缓冲的文档还可以继续使用。
如果客户端在请求一个文件的时候,发现自己缓存的文件有 Last Modified ,那么在请求中会包含 If Modified Since ,这个时间就是缓存文件的 Last Modified 。因此,如果请求中包含 If Modified Since,就说明已经有缓存在客户端。只要判断这个时间和当前请求的文件的修改时间就可以确定是返回 304 还是 200 。对于静态文件,例如:CSS、图片,服务器会自动完成 Last Modified 和 If Modified Since 的比较,完成缓存或者更新。但是对于动态页面,就是动态产生的页面,往往没有包含 Last Modified 信息,这样浏览器、网关等都不会做缓存,也就是在每次请求的时候都完成一个 200 的请求。
因此,对于动态页面做缓存加速,首先要在 Response 的 HTTP Header 中增加 Last Modified 定义,其次根据 Request 中的 If Modified Since 和被请求内容的更新时间来返回 200 或者 304 。虽然在返回 304 的时候已经做了一次数据库查询,但是可以避免接下来更多的数据库查询,并且没有返回页面内容而只是一个 HTTP Header,从而大大的降低带宽的消耗,对于用户的感觉也是提高。
当这些缓存有效的时候,通过 HttpWatch 查看一个请求会得到这样的结果:
第一次访问 200
鼠标点击二次访问 (Cache)
按F5刷新 304
按Ctrl+F5强制刷新 200
如果是这样的就说明缓存真正有效了。以上就是我对 HTTP 304 的一个理解。
相关推荐
-
HTTP 304错误的详细讲解
Not Modified 客户端有缓冲的文档并发出了一个条件性的请求(一般是提供If-Modified-Since头表示客户只想比指定日期更新的文档).服务器告诉客户,原来缓冲的文档还可以继续使用. 如果客户端在请求一个文件的时候,发现自己缓存的文件有 Last Modified ,那么在请求中会包含 If Modified Since ,这个时间就是缓存文件的 Last Modified .因此,如果请求中包含 If Modified Since,就说明已经有缓存在客户端.只要判断这个时间和当
-
pandas中ix的使用详细讲解
在上一篇博客中,我们已经仔细讲解了iloc和loc,只是简单了提到了ix.这是因为相比于前2者,ix更复杂,也更让人迷惑. 因此,本篇博客通过例子的解释试图来描述清楚ix,尤其是与iloc和loc的联系. 首先,再次介绍这三种方法的概述: loc gets rows (or columns) with particular labels from the index. loc从索引中获取具有特定标签的行(或列). iloc gets rows (or columns) at particular
-
java、spring、springboot中整合Redis的详细讲解
java整合Redis 1.引入依赖或者导入jar包 <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.9.0</version> </dependency> 2.代码实现 public class JedisTest { public static void main(String[]
-
详细讲解计算机网络——应用层
目录 应用层协议 一.DNS 1.DNS 是什么 2.域名结构 3.域名服务器 4.DNS 解析流程 5.DNS 服务器查询方式 (1)迭代查询 (2)递归查询 6.DNS 缓存机制 7.DNS 使用 UDP 还是 TCP 区域传送(主.辅 DNS 服务器通信)时使用 TCP 域名解析时使用 UDP 二.万维网 1.万维网概述 (1)超媒体与超文本 (2)万维网的工作方式 (3)万维网必须解决的问题 2.超文本传送协议 HTTP (1)HTTP 的操作过程 (2)请求一个万维网文档所需的时间 3
-
详细讲解HDFS的高可用机制
目录 互斥机制 写流程 读流程 恢复流程 在Hadoop2.X之前,Namenode是HDFS集群中可能发生单点故障的节点,每个HDFS集群只有一个namenode,一旦这个节点不可用,则整个HDFS集群将处于不可用状态. HDFS高可用(HA)方案就是为了解决上述问题而产生的,在HA HDFS集群中会同时运行两个Namenode,一个作为活动的Namenode(Active),一个作为备份的Namenode(Standby).备份的Namenode的命名空间与活动的Namenode是实时同步的
-
超详细讲解Linux C++多线程同步的方式
目录 一.互斥锁 1.互斥锁的初始化 2.互斥锁的相关属性及分类 3,测试加锁函数 二.条件变量 1.条件变量的相关函数 1)初始化的销毁读写锁 2)以写的方式获取锁,以读的方式获取锁,释放读写锁 四.信号量 1)信号量初始化 2)信号量值的加减 3)对信号量进行清理 背景问题:在特定的应用场景下,多线程不进行同步会造成什么问题? 通过多线程模拟多窗口售票为例: #include <iostream> #include<pthread.h> #include<stdio.h&
-
超详细讲解Linux DHCP服务
目录 一.DHCP服务(动态主机配置协议) 1.背景 2.概述 3.优点 4.DHCP报文类型 5.DHCP 的分配方式 二.安装 DHCP 服务器 1.DHCP 服务软件 2.主配置文件 三.配置步骤 1.使用 DHCP 动态的给 PC 机分配 IP 地址 ① eNSP ②虚拟机 ③验证 ④进入命令行"ipconfig"测试 一.DHCP服务(动态主机配置协议) 1.背景 1.手动设置工作量大且容易冲突 2.用DHCP可以减少工作量和避免地址冲突 2.概述 作用:为局域网内的电脑分配
-
socket编程的详细讲解
目录 1:socket大致介绍 2:TCP/IP协议 3:回过头再来理解socket 4:socket的一些接口函数原理 5:socket的一个例子,总结上述的问题 6:上面例子用到的知识点 7:下面就介绍一些API函数: socket编程是网络常用的编程,我们通过在网络中创建socket关键字来实现网络间的通信,通过收集大量的资料,通过这一章节,充分的了解socket编程,文章用引用了大量大神的分析,加上自己的理解,做个总结性的文章 1:socket大致介绍 socket编程是一门技术,它主要
-
超详细讲解Java异常
目录 一.Java异常架构与异常关键字 Java异常简介 Java异常架构 1.Throwable 2.Error(错误) 3.Exception(异常) 4.受检异常与非受检异常 Java异常关键字 二.Java异常处理 声明异常 抛出异常 捕获异常 如何选择异常类型 常见异常处理方式 1.直接抛出异常 2.封装异常再抛出 3.捕获异常 4.自定义异常 5.try-catch-finally 6.try-with-resource 三.Java异常常见面试题 1.Error 和 Excepti
-
Python中关于面向对象私有属性方法的详细讲解
目录 1.私有属性和私有方法 私有属性: 私有方法: 类部调用私有属性和私有方法 子类不能继承父类私有属性和方法 实例属性(对象属性) 通过实例(对象)去修改类属性 2.修改私有属性的值 3.类属性和实例属性 4.类方法和静态方法 类方法: 静态方法: 实例方法 5.__new__方法 6.单例模式 福利 1.私有属性和私有方法 封装的意义: 将属性和方法放到一起做为一个整体,然后通过实例化对象来处理: 隐藏内部实现细节,只需要和对象及其属性和方法交互就可以了: 对类的属性和方法增加 访问权限控
随机推荐
- 超全的js正则表达式整理笔记
- Lua中创建全局变量的小技巧(禁止未预期的全局变量)
- jquery模拟SELECT下拉框取值效果
- 详解在vue-cli项目中安装node-sass
- QWERTY密码:加密与解密vbs版
- Android编程简单实现九宫格示例
- javascript checkbox全选和反选的简单实现
- xmlplus组件设计系列之选项卡(Tabbar)(5)
- 在JavaScript中构建ArrayList示例代码
- 用js实现before和after伪类的样式修改的示例代码
- asp.net中执行存储数据操作时数据被自动截取的一种情况
- 全面解读PHP的人气开发框架Laravel
- Mysql安装 Navicat 出现1044/1045错误的解决方法
- 详解JS构造函数中this和return
- js 时间格式与时间戳的相互转换示例代码
- Ruby实现邮件主动推送触发程序
- 在PostgreSQL中使用日期类型时一些需要注意的地方
- sql Union和Union All的使用方法
- jQuery弹簧插件编写基础之“又见弹窗”
- jQuery 翻牌或百叶窗效果(内容三秒自动切换)