最近一段时间一直在研究页面缓存和压缩方面的东西,由于公司服务器使用的是iis6.0,很多性能方面的优化都不支持。所以,就开始尝试着自己写个简单的处理程序。

为了减少服务器带宽的需求,我们要减少客户端与服务器端交互的数据量。解决方法如下:
1. 缓存很少变化的静态资源,比如JS,CSS和图片。
2. 对网络交互的数据进行压缩,比如对JS,CSS,HTML,图片等。
3. 减少客户端与服务器端的交互次数,我们可以合并所有的JS文件,合并所有的CSS文件。
缓存位于服务器之间和客户端之间,根据请求保存输出内容的副本,如html页面,图片,文件,当下一个请求来到时,如果相同的URL,直接使用副本响应访问请求,而不向源服务器再次发送请求。

以下整理了一些Http请求头相关的知识:

缓存的类型
1. 浏览器缓存
浏览器都有关于缓存的设置。通过在电脑硬盘存储已经看过的网站的副本。
2. 代理服务器缓存
Web代理服务器使用同样的缓存原理,代理服务器群为成百上千用户服务使用同样的机制;代理服务器缓存是共享缓存,为大量用户使用,因此在减少相应时间和带宽使用方面很有效,同一个副本会被重用多次。
3. 网关缓存
也称为反向代理缓存或间接代理缓存,网关缓存也是一个中间服务器,和内网管理员部署缓存用于节省带宽不同,网关缓存一般是网站管理
员自己部署,让他们的网站更容易扩展并获得更好的性能。请求有几种方法被路由到网关缓存服务器上,其中典型的是让用一台或多台负载均衡服务器从客户端看上
去是源服务器。

缓存如何工作
1. 如果响应头信息:告诉缓存器不要保留缓存,缓存器就不会缓存相应内容。
2. 如果请求信息是需要认证或者安全加密的,相应内容默认不会被缓存。
3.如果在回应中不存在校验器(ETag或者Last-Modified头信息),缓存服务器会认为缺乏直接的更新度信息,内容将会被认为不可缓存。
4. 一个缓存的副本如果含有以下信息,内容将会被认为是足够新的。

  • 含有完整的过期时间和寿命控制头信息,并且内容仍在保鲜期内。
  • 浏览器已经使用过缓存副本,并且在一个会话中已经检查过内容的新鲜度。
  • 缓存代理服务器近期内已经使用过缓存副本,并且内容的最后更新时间在上次使用期之前

5.如果缓存的副本已经太旧了,缓存服务器将向源服务器发出请求校验请求,用于确定是否可以继续使用当前拷贝继续服务。

四种常用于控制客户端缓存的头标
1. Last-Modified 最后修改时间
这个头标是一个响应头标,表示客户端(通常指浏览器)所请求资源在服务器端的最后修改时间,通常情况下客户端在接受这个头标后,在以后对这个资源的请求会附
带一个’If-Modified-Since’请求头标,而这个头标是想告诉服务器上次客户端所请求资源的最后修改时间,对于一些图像,css,js等静
态文件资源,配置好了的apache服务器会理解这些If-Modified-Since请求头标,将头标里的时间和文件的最后修改时间进行比较并作出响
应,如果二者相等则发送一个304 Not
Modfied来告诉客户端所请求资源并未修改让客户端放心使用缓存中的资源,否则的话会重新发送一个新的资源和新的Last-Modified的头标。

2. ETag(Entity Tag) 实体标签
和Last-Modified类似,也是WEB服务器和客户端用于确认缓存组件的有效性的一种 机制,apache
1.3和2.0的ETag格式是inode-size-timestamp,因此当资源被修改,其ETag也发生改变,ETag相对Last-
Modified更精确,Last-Modified只能精确的s级别,但是ETag在多服务器可能造成混乱

3. Expires 过期时间
这个属性告诉缓存器相关副本在多长时间内是新鲜的。过了这个时间,缓存器就会向源服务器发送请求,检查文档是否被
修改。几乎所有的缓存服务器都支持Expires属性。可以设计一个绝对时间间隔:基于客户最后查看副本的时间(最后访问时间)或者根据服务器上文档最后
被修改的时间。Expires头信息对于设置静态图片缓存特别有用,这些图片修改很少,可以给它们设置一个特别长的过期时间,这会使网站对用户变得相应非常快。

4. Cache-Control 缓存控制
让网站的发布者控制他们的内容,并定位过期时间的限制。比如:Cache-Control: max-age=3600,
public,可选项如下:

  • max-age =[秒] 执行缓存的最长时间,[秒]是一个数字,单位是秒:从请求时间开始到过期时间之间的秒数。
  • s-maxage =[秒] 类似于max-age属性,除了他应用于共享(如:代理服务器)缓存
  • public 标记认证内容也可以被缓存,一般来说: 经过HTTP认证才能访问的内容,输出是自动不可以缓存的;
  • no-cache强制每次请求直接发送给源服务器,而不经过本地缓存版本的校验。这对于需要确认认证应用很有用(可以和public结合使用),或者严格要求使用最新数据的应用(不惜牺牲使用缓存的所有好处);
  • no-store 强制缓存在任何情况下都不要保留任何副本
  • must-revalidate告诉缓存必须遵循所有你给予副本的新鲜度的,HTTP允许缓存在某些特定情况下返回过期数据,指定了这个属性,高速缓存,希望严格的遵循你的规则。
  • proxy-revalidate 和 must-revalidate类似,除了他只对缓存代理服务器起作用

Http静态资源的缓存的更多相关文章

  1. nginx静态资源设置缓存的方法

    nginx静态资源设置缓存的方法 直接加expires 30d; 就是就可以了 缓存时间30天完整如下 <pre> location / { root /home/www/wordpres ...

  2. Nginx针对前端静态资源的缓存处理

    当用户上报一个线上的bug后,开发者修改前端代码的bug上新后,用户反映问题依旧存在的问题...这种情况是不是曾经遇到过,这个问题跟浏览器的缓存机制有很大关系(强制缓存和协商缓存,这里我就不介绍具体的 ...

  3. gulp之静态资源防缓存处理

    最近,因为校友网项目开始有些规模了.开始就要考虑对静态资源进行工程自动化的管理.一讲到前端的自动化工具,大家或许都会想到Grunt,Gulp,或者百度的FIS.这三个都有各自的特点,大家可以依据自己的 ...

  4. Nginx实现静态资源的缓存

    1.1   需求 1.对静态文件进行缓存:html,js,css,png,gif,jpg,jpeg,bmp,swf. 2.对符合url规则的请求进行缓存. 3.针对某个url进行清除缓存. 1.1   ...

  5. nginx静态资源浏览器缓存

    1.缓存介绍 作用:提升用户体验,减少服务器压力 浏览器无缓存:浏览器发起请求->无缓存->请求WEB服务器->web服务器检查是否有更新(没有更新返回304)->呈现 浏览器 ...

  6. SpringBoot cache-control 配置静态资源缓存 (以及其中的思考经历)

    昨天在部署项目时遇到一个问题,因为服务要部署到外网使用,中间经过了较多的网络传输限制,而且要加载arcgis等较大的文件,所以在部署后,发现页面loading需要很长时间,而且刷新也要重新从服务器下载 ...

  7. 前端工程精粹(一):静态资源版本更新与缓存(附精简js的工具)

    转自:http://www.infoq.com/cn/articles/front-end-engineering-and-performance-optimization-part1/ 每个参与过开 ...

  8. filter 静态资源

    package com.itheima.web.filter; import java.io.IOException; import javax.servlet.Filter; import java ...

  9. java Web程序使用wro4j合并、压缩js、css等静态资源

    在Web项目中,js.css合并压缩,不仅有利于减少Http请求数量.减少宽带资源占用,还能有效的管理各种js.css的引入,使整个项目更加有序.而对于访问用户来说,其更大的好处是增加了页面的打开速度 ...

随机推荐

  1. imagemagick 图像处理扩展

    做图像处理的一个工具. http://www.imagemagick.org/script/command-line-processing.php 支持命令行模式,支持接口调用.php 等等都可以,看 ...

  2. 5路数字量输入Di,5路大电流继电器输出,可电脑控制,支持modbus协议工业模块,支持和DCS,PLC无缝对接。

    数字量输入输出模块MRD-5060具有5路DI,5路继电器输出,1路485接口(支持Modbus RTU),能实现5路DI(干接点输入)转485的采集,也可以通过485控制5路继电器(5A30VDC, ...

  3. 【自学php】第三天 - 读写文件

    这次的例子是把订单的数据保存起来,一般是用数据库来进行数据的存储最好,但是今天目的是为了学习读写文件,所以这次把数据存在文件里. 读写文件有一般有三个步骤: 1)打开文件.如果文件不存在,需要先创建它 ...

  4. 又优化了一下 Android ListView 异步加载图片

    写这篇文章并不是教大家怎么样用listview异步加载图片,因为这样的文章在网上已经有很多了,比如这位仁兄写的就很好: http://www.iteye.com/topic/685986 我也是因为看 ...

  5. android4.0 HttpClient 以后不能在主线程发起网络请求

    android4.0以后不能在主线程发起网络请求,该异步网络请求. new Thread(new Runnable() { @Override public void run() { // TODO ...

  6. Div布局案例

    通常看到这个页面,会想到它是有几块组成的. 第一块,分销佣金. 第二块,包括代言.商品.二维码 其中代言又是左右结构. 于是乎基本的div结构就出来了. <div class="row ...

  7. apache重启操作

    方法: apahce启动命令: 推荐/apachectl start apaceh启动 apache停止命令 /apachectl stop   停止 apache重新启动命令: /apachectl ...

  8. oracle 物化视图导入导出报错

    1.exp导出报EXP-00008: 遇到 ORACLE 错误 1455,ORA-01455: 转换列溢出整数数据类型 2.imp导入报.注: 表包括 ROWID 列, 其值可能已废弃,不是警告也不是 ...

  9. java基础之高级应用

    在程序中涉及方法重写的地方使用@override Annotation(只作用于方法)注释可以很好的避免由于重写方法名字过长而造成的程序后期出现的难以调试的错误,特别是程序没有报任何的错误时,而程序的 ...

  10. 初识Devexpress ChartControl 之 动态添加stepline及TextAnnotation

    最近在用devexpress 第三方软件做项目. devexpress 的控件使用简单.功能强大.类型丰富.界面优美.扩展性强.今天主要是动态生成了一条StepLine.生成后的效果(能力不强,所以做 ...