大致说来304状态码或许不应该认为是一种错误,而是对客户端有缓存情况下服务端的一种响应。

整个请求响应过程如下:

客户端在请求一个文件的时候,发现自己缓存的文件有 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,从而大大的降低带宽的消耗,对于用户的感觉也是提高。当这些缓存有效的时候,通过 Fiddler 或HttpWatch 查看一个请求会得到这样的结果:

第一次访问 200
按F5刷新(第二次访问) 304
按Ctrl+

HTTP 出现304情况及详解相关推荐

  1. 304 Not Modified详解

    第一次访问 200  鼠标点击二次访问 (Cache)  按F5刷新 304  按Ctrl+F5强制刷新 200 在客户端向服务端发送http请求时,若返回状态码为304 Not Modified 则 ...

  2. 304状态码详解(协商缓存)

    304状态码详解(协商缓存) 上一篇文章针对不同的状态码做了一个整理,还说到要专门针对304做一个详解,于是与,今晚又来学习了. 首先说一下背景: 我们知道前端代码打包后需要部署到静态服务器上.客户端 ...

  3. 返回状态码304 Not Modified详解

    第一次访问 200 鼠标点击二次访问 (Cache) 按F5刷新 304 按Ctrl+F5强制刷新 200 在客户端向服务端发送http请求时,若返回状态码为304 Not Modified 则表明此 ...

  4. HTTP状态码304与ETag详解

    总结一下,最近项目开发遇到的.由于缓存框架设计时,缓存请求文件时只以发起请求的url 为key,导致在客户端发起url 相同,传参类型不同的请求时,交替请求会出现,带上一次请求返回的etag ,进行下 ...

  5. python3多进程多种使用情况下详解

    序言 最近在写一个项目,需要使用到多进程.由于整个网络服务器由自己开发,并没有使用模块,所以在多进程上面越用越多的疑惑.经过一系列的测试,对整个python多进程有了更多的认识. 最大体会 每当使用m ...

  6. mysql查询男生基本情况_详解MySql基本查询、连接查询、子查询、正则表达查询...

    select * from STUDENT; 2.2.按条件查询 (1) 比较运算符 > , < ,= , != (< >),>= , <= select * fr ...

  7. Linux笔记——常用命令详解及Shell脚步基本用法

    Linux笔记 修改运行级别 临时切换运行级别:用init命令,例如进入级别3 [root@localhost ~]# init 3 永久切换,需要修改配置文件vi /etc/inittab 重启虚拟 ...

  8. swap分区详解(创建swap分区,启用swap交换空间,关闭swap交换空间)

    文章目录 swap分区 什么是swap分区 swap分区使用情况查看工具 free 案例 swapon 创建swap分区过程 swap分区 什么是swap分区 swap分区是指在Linux操作系统中为 ...

  9. python bytearray转为byte_Python3 bytearray() 函数详解 将参数转为可变的字节数组

    Python3 bytearray() 函数详解 将参数转为可变的字节数组 bytearray()函数的主要用途是将参数转换为一个新的字节数组,它是一个可变的整数序列,它的取值范围是0 <= x ...

  10. 慢查询explan详解

    慢查询排查 show status;  // 查询mysql数据库的一些运行状态 show status like 'uptime'; // 查看mysql数据库启动多长时间,myisam存储引擎长时 ...

最新文章

  1. NHibernate多对多关联映射的实现
  2. js data日期初始化的5种方法
  3. 概要设计和详细设计区别_一体化工程设计:打破前期工程设计与详细设计之间的藩篱...
  4. linux配置usb主从_一种Linux下USB设备主从切换的实现
  5. Linux MySQL 忘记root 密码
  6. 用了mysql报oracle错误_Oracle认证:PHP开发者常犯的MySQL错误
  7. ITK:从文件读取转换
  8. golang的一个简单小爬虫demo学习记录
  9. 阿里“计算”家族技术领头人分享会
  10. 应用指定显示到副屏_LED灯杆屏广泛应用逐渐成为智慧城市信息化的重要窗口
  11. 文本挖掘(part2)--分词
  12. OSGi将Maven与Equinox结合使用
  13. rmi远程代码执行漏洞_fastjson远程代码执行漏洞复现
  14. [4]Telerik Grid 简单使用方法
  15. 2.3.2. 进程互斥的软件实现方法
  16. 炎热天气看书还是钓鱼?隐马尔科夫模型教你预测!
  17. Python新手学习基础之运算符——位运算
  18. 【渝粤教育】国家开放大学2018年春季 0176-21T电机学(一) 参考试题
  19. 变量名可以是python的关键字_python – 如何使用关键字作为变量名?
  20. 首师大附中互测题:LJX的校园:入学典礼【C003】

热门文章

  1. GridLayout 介绍 (转载自http://www.cnblogs.com/skywang12345/p/3154150.html)
  2. 中国象棋人工智能实现
  3. fopen w和 w+属性的区别
  4. matlab的解线性方程组
  5. 线性代数————思维导图(上岸必备)(相似理论)
  6. mysql监听显示syn_sent,TCP协议端口状态说明:CLOSE-WAIT、TIME-WAIT 、LISTENING、SYN_SENT、ESTABLISHED、LAST-ACK ......
  7. (转)sonicstage 完整删除的方法
  8. 注塑过程中30个常见的问题及对策
  9. Python爬虫编程思想(82):管理SQLite数据库
  10. 百度:一盗功成万网枯