`
sangeshitou
  • 浏览: 27596 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

web cache 机制 (cache-control)

阅读更多

什么是cache?

cache理所应当就是缓存,缓存能提升我们网站应用的性能,这是毋庸置疑的。那么HTTP协议是如何支持CACHE机制的?

我们一起来探索下。

 

首先是http协议头里的原文(w3c cache

 

这篇说明大概总结如下:

客户端访问一个http请求的时候,先确认客户端缓存是否有这个entry,有,则校验其可用性(比如过期时间,id等),若有效,则直接返回客户端;cache中没有此entry,则请求服务端。

 

HTTP协议是如何保证这个流程的?

可以看 cache-control 这个http header,cache-control是http/1.1中的内容,兼容http/1.0 的pragma

 

cache-control 常用的属性有

 max-age 和 no-cache

具体写法如下:

<META HTTP-EQUIV="Cache-Control" CONTENT="max-age=0" />

 <META HTTP-EQUIV="Cache-Control" CONTENT="no-cache" />

上述代码的意思是:

第一行: 永远过期,每次请求都必须和服务器交互,max-age的单位是秒

第二行: 客户端不cache

 PS max-age 的优先级是高于http 的expires头的优先级的,也就是说设置了max-age会覆盖expires头的过期时间。如果服务端cache-control和expires都没有设置,根据http协议客户端会自动计算一个过期时间。

 

当客户端发起一个http请求的时候,客户端确认这个缓存存在且有效,那么就直接返回缓存的内容。那么如何判定一个缓存是否有效呢?

校验的规则可以有很多,现有常见的校验的字段为

  1. last-modified
  2. ETag(entity tag)
  3. IF-MODIFIED-SINCE
  4. IF-UNMODIFIED-SINCE

校验分为强校验和弱校验。

强校验指当实体(请求的对象)改变的时候,相关的校验器也随着改变;否则称之为弱校验。

 

我们拿Etag举例子;

当客户端发送一个请求,请求头里有个字段为ETag =1,当服务端接收到这个请求的时候,解析出这个ETag为1,服务端和本地的这个请求实体的ETag比较,如果相同那么返回304,否则返回新的实体。

这就是整一个校验过程。

 

知道了这个原则,我们做应用的时候就要注意以下两点:

  1. cache所有能cache的资源,并且能cache多久cache多久
  2. 不cache html

那这样会出现另一个问题:当请求时体改变的时候,客户端不能得到实时的更新。

 

所以我的解决方案如下:

  1. 给所有的静态资源(除了html资源和动态资源)加上cache,并附上版本号,web服务器(apche|nginx)设置cache过期时间为永久。
  2. 所有的html 不cache <META HTTP-EQUIV="Cache-Control" CONTENT="no-cache" />

<script type="text/javascript" src="a.js?v=1" ></script>
分享到:
评论
1 楼 qdujunjie 2016-01-20  
楼主我有个问题,静态资源设置cache-control是可以进行cache的,但是动态资源,例如php,就算服务器端的返回正确设置了cache-control为max-age=10000,客户端浏览器马上访问,还是会去请求server端,这是为什么呢?

是因为不能缓存动态资源吗???

回复我邮件也可以:qdujunjie@126.com

相关推荐

    us-17-Gil-Web-Cache-Deception-Attack-wp.pdf

    在正常的Web交互中,服务器根据HTTP请求头(如Cache-Control、Pragma等)决定是否缓存内容。在缓存欺骗攻击中,攻击者通过精心构造请求,诱使服务器将恶意内容存入缓存。 3. **Web缓存欺骗方法**: 攻击者首先将...

    Cache-control使用Cache-control:private学习笔记

    在HTTP协议中,Cache-Control头字段是用于管理缓存行为的关键机制,它允许服务器指示客户端如何缓存响应内容。`Cache-Control`字段可以接受多种指令,以控制网页的缓存策略。在本文中,我们将深入探讨`Cache-Control...

    http cache-control详解

    Response.CacheControl = "no-cache" ' 禁止缓存 ``` 以上代码示例展示了如何使用ASP来调整HTTP响应的缓存控制设置。 综上所述,`Cache-Control`和`Expires`字段是HTTP缓存策略的重要组成部分,它们决定了浏览器...

    http头部cache-control字段解析

    总结,理解并正确使用`Cache-Control`字段对于优化Web应用程序性能至关重要。根据需求设置不同的指令,可以实现高效、安全的缓存策略,提升用户体验,同时减轻服务器压力。通过阅读提供的doc和pdf文件,你可以更深入...

    Nginx跨域设置Access-Control-Allow-Origin无效的解决办法

    add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type'; add_header 'Access-Control-Max-Age' 1728000; # ...

    Nginx配置跨域请求Access-Control-Allow-Origin * 详解

    Nginx配置跨域请求Access-Control-Allow-Origin * 是解决现代Web应用中常见问题的一个关键步骤。在Web开发中,由于浏览器的同源策略限制,不同源的网站之间不能直接进行AJAX请求,除非服务器允许这样的跨域行为。...

    Go-Go的缓存控制中间件添加ETag头(内容的md5)和Cache-Control头

    例如,`Cache-Control: max-age=3600`表示资源可以在客户端缓存一小时,而`Cache-Control: no-cache`则指示代理服务器或浏览器在每次请求时都要向服务器验证资源是否已更新。 以下是一个简单的Go中间件实现示例,...

    Laravel开发-response-cache

    在本文中,我们将深入探讨Laravel的响应缓存机制,并通过`response-cache`组件来了解如何在实际开发中应用。 首先,让我们理解响应缓存的基本原理。当一个请求到达服务器,如果该请求的响应已经被缓存,那么Laravel...

    SERVLET 上传文件原理,Cache-Contro,java编码,jbpm原理

    例如,`Cache-Control: no-cache`意味着每次请求都应该向服务器验证是否更新了资源;`Cache-Control: max-age=3600`表示响应可以被缓存一小时。理解并正确设置`Cache-Control`对于优化网站性能和减少网络流量至关...

    jersey-header-cache-control

    与 JAX-RS Web 服务一起使用的注释,以向响应添加标头“Cache-Control”。 该项目应该被视为只是 JAX-RS 环境中注释功能的骨架。 用法 使用资源配置: 在package.name 中包含 CacheFilterFactory.java 并在您的 ...

    nginx缓存不起作用问题解决方法

    header主要有如下: 代码如下:Cache-control:no-cache、no-store如果出现这两值,nginx缓存服务器是绝对不会缓存的 代码如下:Expires:1980-01-01如果出现日期比当前时间早,也不会缓存。 2. 解决不缓存方案 2.1 ...

    cache-manager-web-example

    【标题】"cache-manager-web-example" 是一个基于JavaScript的缓存管理器的Web应用实例,旨在展示如何在Web环境中有效地管理和使用缓存机制。这个项目可能是为了帮助开发者理解和实践前端缓存策略,以提高应用程序的...

    Java Web程序设计入门课件-HTTP协议.pptx

    响应头字段提供了关于响应的更多信息,如Location用于指示重定向的URL,Cache-Control和ETag用于缓存控制,Date和Server标识响应的创建时间和服务器信息,Content-Type定义了响应体的数据类型,Content-Length指示...

    sinatra-cache-control

    常见的`Cache-Control`指令包括`public`、`private`、`no-cache`、`max-age`等。例如,`public`指示响应可被任何中间缓存存储,`max-age`则指定了缓存的有效期。 在Sinatra中,我们可以通过设置响应头来添加`Cache-...

    强制缓存和协商缓存资源

    强制缓存和协商缓存是Web开发中两个非常重要的概念,它们都是浏览器缓存机制的一部分,用于提高网站性能和用户体验。 强制缓存是指浏览器在第一次请求资源时,服务器会在响应头中添加 Cache-Control 字段,指定缓存...

    IIS中User-mode caching引起的Cache-Control不为public问题的解决方法

    如果你希望保留User-mode caching并确保`Cache-Control`为`public`,可以在Web.config中添加或修改静态内容的配置。如示例所示,添加`&lt;clientCache&gt;`元素到`&lt;staticContent&gt;`部分,并设置`cacheControlCustom=...

    网站Cache全分析.doc

    - Cache-Control:定义了更复杂的缓存策略,如max-age、no-cache等,具有较高的优先级。 - Pragma:通常不用,但在某些情况下可以设置特定指令。 Cache的工作流程通常包括:客户端首次请求资源,服务器返回完整内容...

    Apache_TrafficControl-2.0.2-py3-none-any.whl.zip

    这个压缩包文件“Apache_TrafficControl-2.0.2-py3-none-any.whl.zip”包含了该系统的特定版本,即版本2.0.2,且它是为Python 3环境设计的。WHL文件是Python的 Wheel 包格式,它是一种预编译的Python库分发格式,...

Global site tag (gtag.js) - Google Analytics