今天在用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: private`,浏览器会在首次访问时请求服务器,之后的访问会依赖于浏览器的缓存策略,但不会被中间的代理服务器缓存。 2. **其他...
2. 使用 jQuery Ajax 清除浏览器缓存:可以使用 $.ajax() 方法并设置 cache:false,或者使用 If-Modified-Since 和 Cache-Control 请求头来清除浏览器缓存。 3. 使用随机数或随机时间来避免缓存:可以在 URL 参数后...
即使资源在缓存中有,也会发送一个条件请求(通常带有`If-Modified-Since`或`If-None-Match`头)来检查是否有更新。 4. `no-store` `no-store`指令指示代理和浏览器不应存储任何部分的响应,包括临时或永久的存储,...
3. 缓存验证:若资源可能已更新,浏览器会发送一个带有If-None-Match或If-Modified-Since头的请求到服务器,服务器根据这些头信息判断资源是否改变,若无变化则返回304 Not Modified状态码,浏览器继续使用缓存;...
同时,Service Worker技术也是现代浏览器缓存的重要组成部分,它允许开发者更精细地控制离线缓存和预加载策略。 理解并合理利用这些机制,可以有效地减少网络传输,提升用户体验。例如,设置合适的缓存策略可以减少...
3. **重新验证**: 如果资源已经过期,浏览器将向服务器发送一个新的请求,附带`If-Modified-Since` 或 `If-None-Match` 头部,询问资源是否已被修改。如果资源未更改,则服务器返回304 Not Modified状态码,表明可以...
浏览器会发送`If-Modified-Since`头,包含上次获取资源时的`Last-Modified`时间,服务器比较这个时间与当前资源的修改时间,如果未修改,返回304状态码,否则返回完整资源。 HTTP头中的关键字段包括: - `Pragma: ...
浏览器缓存机制是互联网浏览体验中的重要组成部分,它极大地提高了网页加载...通过“浏览器缓存机制-脑图.emmx”和“浏览器缓存流程及协商缓存流程.vsdx”这两个文件,我们可以更清晰地了解这一复杂但至关重要的技术。
如果资源未发生变化,服务器将返回304 Not Modified状态码,通知浏览器使用其缓存的副本。协商缓存依赖于以下HTTP头部: - **Last-Modified/If-Modified-Since**: 用于比较服务器上的文件最后修改时间与客户端缓存...
5. If-Modified-Since / If-Unmodified-Since:浏览器在请求时携带这些头来询问服务器资源是否已修改或未修改,以决定是否需要更新。 在实践中,可以通过设置HTTP响应头来管理浏览器缓存。例如,可以使用`Cache-...
可以设置`"If-Modified-Since"`为`"0"`或`"Cache-Control"`为`"no-cache"`,如下: ```javascript xhr.setRequestHeader("If-Modified-Since", "0"); xhr.setRequestHeader("Cache-Control", "no-cache"); ``` ...
不同类型文件可能会被存放在不同的缓存中,例如JavaScript和图片常存于内存缓存,CSS文件则可能存于硬盘缓存。 通用信息头(如Cache-Control、Connection、Date等)在请求和响应报文中都能看到,它们提供了一些基本...
**Ajax加载页面时遇到304 Not Modified状态码详解** 在使用Ajax技术进行网页部分更新时,如果服务器返回304 Not Modified状态码,这意味着客户端(浏览器)在向服务器请求资源时,服务器发现该资源自上次请求后并未...
浏览器缓存机制、Expires策略(http1.0)和Cache-control策略(http1.1)、Last-Modified/If-Modified-Since、ETag/If-None-Match
- **If-Modified-Since**:如果浏览器请求头中包含了此字段,它会在条件请求中携带资源的最后修改时间,服务器如果发现资源没有修改,则返回304状态码,否则返回200状态码和更新后的资源。 - **If-None-Match**...
- F5通常会包含If-Modified-Since或If-None-Match字段,服务器响应304表示无需更新缓存。 - CTRL+F5则包含Pragma:no-cache或Cache-Control:no-cache字段,强制服务器返回最新的文件,从而跳过缓存。 进行刷新操作时...
协商缓存的字段有 Last-Modified / If-Modified-Since 和 Etag / If-None-Match,其中 Etag / If-None-Match 的优先级比 Last-Modified / If-Modified-Since 高。 Last-Modified 字段,它的值是该资源文件在服务器...
如果客户端在下次请求时提供`If-Modified-Since`头,服务器会比较这个时间,如果资源未修改,则返回`304 Not Modified`。 4. **强缓存与协商缓存**: 强缓存(如`Cache-Control: max-age`)不需要与服务器通信,直接...
强缓存通过这些头部直接决定是否使用缓存,而协商缓存则通过`Last-Modified`/`If-Modified-Since`或`ETag`/`If-None-Match`与服务器通信来验证资源是否更新。Service Worker提供了更细粒度的缓存控制,支持离线应用...
3. `Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization'`:设置允许的请求头,防止因特定请求头未被服务器...