`

HTTP 协议中缓存处理机制(Expires、Last-Modified、ETag

    博客分类:
  • http
 
阅读更多

 

应用场景

了解 HTTP(我们这里说的是 HTTP/1.1) 协议中缓存的处理机制,会对网站优化有些许帮助,例如会应用到:加速网站的加载,服务器端与浏览器文件及时同步。

浏览器请求 URL 时,根据 HTTP 协议的规定,浏览器与服务器会通过报头(HTTP Request HeaderHTTP Reponse Header)进行交流,并根据其协议中和缓存的相关字段(Expires、Last-Modified、ETag)进行处理缓存。参数示例如下:

  • Expires: 12:07:08 Monday, May 20, 2013 GMT
  • Last Modification: 03:21:32 Wednesday, November 21, 2012 GMT
  • Last Cache Update: 12:07:08 Wednesday, November 21, 2012 GMT
  • Last Access: 14:33:07 Tuesday, November 27, 2012
  • ETag: “3511605509″

缓存处理流程

1.浏览器第一次请求 URL,若此资源正常服务器将返回状态 200,并获取存储与缓存相关的属性,用于以后的请求:

  • Expires: 记录超时时间,即文件到了这个记录的时间点,就不能再用浏览器的对应此 URL 的缓存了,该去服务器上拿了。
  • Last Modification: 服务器中,此 URL 对应文件在服务器的最近更新时间。
  • ETag: “被请求变量的实体标记”,可以理解为服务器中此 URL 对应文件的唯一标识符。

2.浏览器第二次请求 URL,首先将比较 Expires 的时间与当前请求时间,若未超时,则直接读取缓存,不与服务器交互。

3.若比较 Expires 发现已超时或缓存失效时,浏览器将请求 URL。同时带了属性,用于检测文件是否更新:

  • If-None-Match: 值为第一次请求的 ETag。
  • If-Modified-Since: 值为第一次请求的 Last-Modification。

4.若 If-None-Match 值(即 ETag)未改变,且 If-Modified-Since 该时间之后文件未被修改过,则服务器仅返回状态 304,意思就是,不用更新,从缓存中拿吧~ 这样做的好处是,不用重复传输文件内容了,提高了加载速度又确定了文件与服务器一致,另外,也重新计算 Expires 的值(若超时时间为 24h,则 Expires 值刷新为此请求时间的一天后)。

5.若 If-None-Match 值改变,或比较 If-Modified-Since 时间发现文件被修改,则文件已更新,服务器将重新发出资源,返回和第一次请求流程类似。

流程结束。这样的流程好处是:既保证不向浏览器重复发送同一资源,有保证了当服务器 URL 对应资源有更新时,客户端能够同步到最新的资源。

应用实例

在实际的网站开发中,线上环境通常会有出现 CSS、JS 更新,若服务器端已更新,而浏览器还是在使用缓存而不同步,将出现页面展示或 JS 异常等问题,为了保证浏览器能及时同步资源,我们可以这样做:

将 Expires 设置为 -1,意思是立即超时,则每次加载资源都会请求 URL,通过 Last Modification 和 ETag 来由服务器来判断是否更新。这样就保证了服务器与浏览器资源文件同步。

上面的方法虽然同步了,但是也使所有资源文件每次都将访问服务器,而建立连接,本来就会有时间损耗,所以改进如下:

将 Expires 设为一年或者更长 ,则浏览器不会主动请求 URL。但在 URL 后面加上类似时间戳的参数,例如 “website/css/index.css?tm=2012112730.css”,后面跟的参数其实是没有实际意义的,但是,每次在我们需要客户端同步对应文件时,仅需要修改对应文件 URL 的 tm 参数即可,浏览器发现 URL 为新 URL,将即刻更新。

百度、淘宝等对 JS、CSS缓存处理用的基本都是上面的策略,这样做的好处是:浏览器默认任何时候都仅使用缓存,加快了加载。而当文件需要更新时,通过修改参数又能让浏览器及时更新。

总结

了解协议对优化和规范网站开发有不少帮助,上面提到的属性和应用场景容易被开发者疏忽,在现在这种互联网开发迭代速度极快的节奏下,上面的问题就会更加容易暴露,规范处理好了会省心很多。

本文提到的属性和应用场景是协议和网站开发的一小部分,抛砖引玉,欢迎纠错

分享到:
评论

相关推荐

    Http页面缓存机制

    浏览器端缓存机制可以分为两类: Cache-Control、Etag、Expires、Last-Modified 和 Vary。这些规则可以控制浏览器缓存的行为,影响浏览器缓存的结果。 Cache-Control 是一种控制浏览器缓存的规则,它可以控制...

    Etag和Expires.docx

    《Etag与Expires:优化页面缓存的策略》 在网页加载速度和用户体验日益重要的今天,有效的页面缓存机制成为了提高网站性能的关键。Etag和Expires是两种常见的HTTP缓存策略,它们各自有不同的工作原理和应用场景。...

    浏览器的缓存机制1

    协商缓存是浏览器携带先前的缓存标识(如Last-Modified或Etag)向服务器询问资源是否已更新,服务器根据这些标识判断资源是否改变,若无变化则返回304状态码,浏览器使用本地缓存;若有变化,服务器返回200状态码及...

    浏览器HTTP缓存运行机制流程图.zip

    浏览器HTTP缓存是提高网页加载速度和降低服务器压力的关键机制,它主要分为两种类型:强缓存(Strong Cache)和协商缓存(Conditional Cache)。理解这两种缓存的工作原理对于优化Web应用性能至关重要。 1. 强缓存...

    最新大厂前端面试题-笔试题2.doc

    2. 服务端优化:使用 CDN、expires/cache-control 强缓存、Etag/Last-modified 协商缓存、GZIP 压缩等。 3. CSS 优化:将样式表放到页面顶部、不要使用 CSS 表达式等。 4. JS 优化:将脚本放到页面底部、压缩 JS 和 ...

    浏览器HTTP缓存机制

    验证缓存依赖于`Last-Modified` 和 `ETag` 头部来确定缓存是否仍有效。 - **Last-Modified**: 标识响应资源的最后修改时间,精确到秒。但是,对于一秒内多次修改的资源,该值可能不够精确。 - **ETag**: 服务器上...

    浏览器缓存机制 mindMaster脑图与visio流程图

    当强缓存失败,即资源过期或者不存在于缓存中时,浏览器会向服务器发送一个条件请求,携带ETag或Last-Modified信息。服务器根据这些信息判断资源是否改变,如果没有变化,会返回304 Not Modified状态码,浏览器则...

    Http页面缓存机制(转)

    - 当服务器端资源更新时,可以通过修改 `Expires` 或 `Cache-Control` 的值,或者更新 `Last-Modified` 或 `ETag` 来通知浏览器获取新的资源。 ### 5. 缓存的优势与问题 优势: - 提升性能:避免了不必要的网络...

    浏览器缓存机制

    浏览器缓存机制、Expires策略(http1.0)和Cache-control策略(http1.1)、Last-Modified/If-Modified-Since、ETag/If-None-Match

    浏览器之HTTP缓存的那些事

    在实际应用中,Nginx往往会同时支持Last-Modified和ETag,以提高缓存效率和准确性。 #### 七、总结 综上所述,了解和掌握浏览器缓存机制及其相关的HTTP头部信息对于优化网站性能至关重要。通过合理配置这些头部...

    web浏览器-缓存详解

    1. HTTP缓存:基于HTTP协议的缓存机制,主要通过HTTP响应头中的Cache-Control、Expires、ETag、Last-Modified等字段来控制缓存行为。 - Cache-Control:用于设置缓存策略,如max-age指示资源的有效期,no-cache则...

    浏览器缓存技术介绍以及优化建议

    强缓存通过这些头部直接决定是否使用缓存,而协商缓存则通过`Last-Modified`/`If-Modified-Since`或`ETag`/`If-None-Match`与服务器通信来验证资源是否更新。Service Worker提供了更细粒度的缓存控制,支持离线应用...

    Android http缓存实现

    HTTP缓存主要遵循HTTP协议中的缓存控制机制,如ETag、Last-Modified等头信息。下面将详细讨论Android中如何实现HTTP缓存。 1. **Android HTTP缓存的基本概念** - **HTTP缓存策略**:主要有两种,一是强缓存(Cache...

    彻底理解浏览器的缓存机制.docx

    浏览器缓存机制是基于HTTP协议实现的,它通过缓存标识来判断请求的数据是否可以被重用,从而避免了不必要的网络传输。 #### 二、HTTP报文结构简述 在深入了解浏览器缓存机制之前,我们需要对HTTP报文的基本结构...

    初探浏览器缓存实现原理-提高性能

    此外,`ETag`(实体标签)也是验证缓存有效性的一个方法,它为每个资源生成一个唯一的标识符,当资源更新时,`ETag`也会变化,服务器通过比较`If-None-Match`头中的`ETag`值来判断是否需要提供新的内容。 在实际应用...

    RemETag_去除iis的etag_配置ETag_iis性能优化

    Etags原理:Add an Expires header已经对浏览器缓存机制中的Cache-Control和Expires进行了配置,这一条评测的是另外两个:Last-Modified和ETag。简单的说,即使设置了文件的期限,浏览器在访问资源时也会因为Last-...

    存储篇 1:浏览器缓存机制介绍与缓存策略剖析(1).md

    HTTPCache是通过HTTP协议头中的字段来控制的缓存机制,它又分为强缓存和协商缓存两种策略。 ##### 强缓存 强缓存是通过Expires和Cache-Control字段来实现的。当请求再次发出时,如果缓存未过期,浏览器将直接从...

    浏览器缓存策略Httpwatch

    浏览器缓存策略是HTTP协议中的一种机制,旨在提高网页加载速度和降低服务器负载。通过缓存,浏览器可以在用户再次访问同一网页时,直接从本地存储中读取之前下载的资源,而不是每次都向服务器请求。Httpwatch是一款...

    HTTP缓存算法研究与实现.pdf

    在HTTP协议中,缓存机制主要包括文档过期(Document Expiration)和服务器再验证(Server Revalidation)两种方式。 文档过期机制是通过HTTP响应头中的Expires或Cache-Control: max-age字段来设定文档的有效期限。...

Global site tag (gtag.js) - Google Analytics