`
xiaofan_0204
  • 浏览: 126937 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

图片缓存:浏览器刷新 和 304 Not Modified 与 If-Modified-Since 及 Cache-Control

 
阅读更多
今天在用chrome浏览淘宝页面的时候,发现很多来自淘宝图片HTTP状态码是 304 Not Modified

到百度搜索了一下,明白了 304状态的含义(以下绿色内容来自网络):

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 的请求。

我突然想起我所写的图片服务器没有实现HTTP 304 缓存功能。

这个 304 状态一般主要在用户刷新页面(F5键)的时候触发.
当用户在刷新页面的时候,因为原来的页面里的很多图片已经缓存过,客户端的浏览器已经记录了图片的最后更新时间(Last Mod),所以在用户刷新页面的时候,会向服务器提交一个字段:If-Modified-Since: Wed, 08 Sep 2010 21:35:06 GMT


这个时候,服务器端的程序先取得这个字段的值,然后与服务器上的图片最后修改时间对比,如果相同,就直接返回 304 Not Modified ,然后停止。这样就不用把图片重新传输到客户端,达到节省带宽的目的。

关于 Cache-Control: max-age=秒 和 Expires

Expires = 时间,HTTP 1.0 版本,缓存的载止时间,允许客户端在这个时间之前不去检查(发请求)
max-age = 秒,HTTP 1.1版本,资源在本地缓存多少秒。
如果max-age和同时存在,则被Cache-Control的max-age覆盖。

Expires 的一个缺点就是,返回的到期时间是服务器端的时间,这样存在一个问题,如果客户端的时间与服务器的时间相差很大,那么误差就很大,所以在HTTP 1.1版开始,使用Cache-Control: max-age=秒替代。

今天我还发现一个小的问题,是关于客户端的日期格式:

Wed, 08 Sep 2010 21:35:06 GMT 与 Wed, 8 Sep 2010 21:35:06 GMT

注意上面的格式,一个是8的前面有个前置的0,一个没有。

我发现firefox和chrome对这个日期格式处理一致,ie有点不同。
最终我修改了服务器端的程序:
//HTTP 日期格式: Wed, 08 Sep 2010 21:35:06 GMT
DateFormat dateFormatGMT = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z", Locale.ENGLISH); //时间格式
分享到:
评论

相关推荐

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

    在打开新窗口、地址栏回车、后退按钮和刷新按钮的场景下,如果设置了`Cache-Control: private`,浏览器会在首次访问时请求服务器,之后的访问会依赖于浏览器的缓存策略,但不会被中间的代理服务器缓存。 2. **其他...

    HTTP+JS+浏览器缓存技术

    2. 使用 jQuery Ajax 清除浏览器缓存:可以使用 $.ajax() 方法并设置 cache:false,或者使用 If-Modified-Since 和 Cache-Control 请求头来清除浏览器缓存。 3. 使用随机数或随机时间来避免缓存:可以在 URL 参数后...

    http头部cache-control字段解析

    即使资源在缓存中有,也会发送一个条件请求(通常带有`If-Modified-Since`或`If-None-Match`头)来检查是否有更新。 4. `no-store` `no-store`指令指示代理和浏览器不应存储任何部分的响应,包括临时或永久的存储,...

    web浏览器-缓存详解

    3. 缓存验证:若资源可能已更新,浏览器会发送一个带有If-None-Match或If-Modified-Since头的请求到服务器,服务器根据这些头信息判断资源是否改变,若无变化则返回304 Not Modified状态码,浏览器继续使用缓存;...

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

    同时,Service Worker技术也是现代浏览器缓存的重要组成部分,它允许开发者更精细地控制离线缓存和预加载策略。 理解并合理利用这些机制,可以有效地减少网络传输,提升用户体验。例如,设置合适的缓存策略可以减少...

    浏览器HTTP缓存机制

    3. **重新验证**: 如果资源已经过期,浏览器将向服务器发送一个新的请求,附带`If-Modified-Since` 或 `If-None-Match` 头部,询问资源是否已被修改。如果资源未更改,则服务器返回304 Not Modified状态码,表明可以...

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

    浏览器会发送`If-Modified-Since`头,包含上次获取资源时的`Last-Modified`时间,服务器比较这个时间与当前资源的修改时间,如果未修改,返回304状态码,否则返回完整资源。 HTTP头中的关键字段包括: - `Pragma: ...

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

    浏览器缓存机制是互联网浏览体验中的重要组成部分,它极大地提高了网页加载...通过“浏览器缓存机制-脑图.emmx”和“浏览器缓存流程及协商缓存流程.vsdx”这两个文件,我们可以更清晰地了解这一复杂但至关重要的技术。

    浏览器之HTTP缓存的那些事

    如果资源未发生变化,服务器将返回304 Not Modified状态码,通知浏览器使用其缓存的副本。协商缓存依赖于以下HTTP头部: - **Last-Modified/If-Modified-Since**: 用于比较服务器上的文件最后修改时间与客户端缓存...

    浏览器缓存策略Httpwatch

    5. If-Modified-Since / If-Unmodified-Since:浏览器在请求时携带这些头来询问服务器资源是否已修改或未修改,以决定是否需要更新。 在实践中,可以通过设置HTTP响应头来管理浏览器缓存。例如,可以使用`Cache-...

    Ajax 缓存问题,Ajax 缓存问题

    可以设置`"If-Modified-Since"`为`"0"`或`"Cache-Control"`为`"no-cache"`,如下: ```javascript xhr.setRequestHeader("If-Modified-Since", "0"); xhr.setRequestHeader("Cache-Control", "no-cache"); ``` ...

    浏览器的缓存机制1

    不同类型文件可能会被存放在不同的缓存中,例如JavaScript和图片常存于内存缓存,CSS文件则可能存于硬盘缓存。 通用信息头(如Cache-Control、Connection、Date等)在请求和响应报文中都能看到,它们提供了一些基本...

    ajax加载页面服务器返回 304 not modified

    **Ajax加载页面时遇到304 Not Modified状态码详解** 在使用Ajax技术进行网页部分更新时,如果服务器返回304 Not Modified状态码,这意味着客户端(浏览器)在向服务器请求资源时,服务器发现该资源自上次请求后并未...

    浏览器缓存机制

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

    面试题浏览器缓存和数据压缩.pdf

    - **If-Modified-Since**:如果浏览器请求头中包含了此字段,它会在条件请求中携带资源的最后修改时间,服务器如果发现资源没有修改,则返回304状态码,否则返回200状态码和更新后的资源。 - **If-None-Match**...

    UrlRewriter 缓存问题及一系列的相关探索

    - F5通常会包含If-Modified-Since或If-None-Match字段,服务器响应304表示无需更新缓存。 - CTRL+F5则包含Pragma:no-cache或Cache-Control:no-cache字段,强制服务器返回最新的文件,从而跳过缓存。 进行刷新操作时...

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

    协商缓存的字段有 Last-Modified / If-Modified-Since 和 Etag / If-None-Match,其中 Etag / If-None-Match 的优先级比 Last-Modified / If-Modified-Since 高。 Last-Modified 字段,它的值是该资源文件在服务器...

    HTTP cache trainning

    如果客户端在下次请求时提供`If-Modified-Since`头,服务器会比较这个时间,如果资源未修改,则返回`304 Not Modified`。 4. **强缓存与协商缓存**: 强缓存(如`Cache-Control: max-age`)不需要与服务器通信,直接...

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

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

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

    3. `Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization'`:设置允许的请求头,防止因特定请求头未被服务器...

Global site tag (gtag.js) - Google Analytics