Http Status 304响应状态的资源更新机制

原文地址

http://my.oschina.net/ososchina/blog/339896


http请求头和响应头可以避免重复的资源(css,js,图片,文本等),浏览器一般访问这些静态资源之后会缓存一段时间,静态资源一般是不会经常改变的,而且这些资源比较大,比较多的情况会影响加载效果,所以要避免多次从网络加载这些文件。

一个完整的请求(本文作于2014-11-12,但资源时间是2014-10-30)

?
1
2
3
4
5
6
7
8
9
10
11
GET /assets/github-208780c72d87b50a0c3b932094adabe0ed787e29f3a60ddf60b7a8c0b66aeaff.css HTTP/ 1.1
Host: assets-cdn.github.com
Connection: keep-alive
Cache-Control: max-age= 0
Accept: text/css,*/*;q= 0.1
If-Modified-Since: Thu,  30  Oct  2014  22 : 36 : 24  GMT
User-Agent: Mozilla/ 5.0  (Windows NT  6.1 ; WOW64) AppleWebKit/ 537.36  (KHTML, like Gecko) Chrome/ 37.0 . 2062.124  Safari/ 537.36
Referer: https: //github.com/
Accept-Encoding: gzip,deflate
Accept-Language: en-US,en;q= 0.8
Cookie: logged_in=no; _octo=GH1. 1.1132014134 . 1407914921 ; _ga=GA1. 2.249759956 . 1407914919

服务器响应

?
1
2
3
4
5
6
7
8
HTTP/ 1.1  304  Not Modified
Date: Sun,  02  Nov  2014  01 : 59 : 39  GMT
Server: Apache
Via:  1.1  varnish
Last-Modified: Thu,  30  Oct  2014  22 : 36 : 24  GMT
Cache-Control: max-age= 31536000 public
Expires: Sat,  31  Oct  2015  20 : 46 : 08  GMT
Age:  105210


浏览器资源访问过程:

1.当访问静态资源文件时,首先使用url hashcode作为key查询本地资源缓存。

2.如果没找到资源,那么直接访问浏览器,然后将请求的资源文件缓存并载入到html中。

3.如果找到资源,读该资源在服务器创建的的时间,加入http响应头If-Modified-Since: Thu, 30 Oct 2014 22:36:24 GMT,并发送到服务器。

4.服务器根据url进行查找资源,如果未找到,返回404。否则读取资源创建时间,给出响应状态吗。

5.浏览器如果收到404,会清空hascode对应的缓存,资源无法加载到html

6.浏览器如果收到 304,检查Last-Modified:Thu, 30 Oct 2014 22:36:24 GMT,如果(Last-Modified=If-Modified-Since),表示文件未被修改,则直接使用本地缓存加载到html.

7.比较之后,如果服务器>浏览器,则重新请求资源。

8.如果是200,则进行本地缓存更新  Last-Modified>If-Modified-Since,并加载到html。

这个过程看似复杂,但提高了资源的访问效率


额外浅谈一下验证码问题。

验证码刷新问题也是这个原理,一般来说验证码生成之后会缓存到服务上,他的创建时间和浏览器读取到的创建时间进行比较后,往往不在请求服务器。

验证码更新问题的结局,因为无法设置If-Modified-Since,但可以修改url,当url不行同时hashcode是找不到资源的,他会再次请求的,比如我们使用js,可以这样改变验证码的url, 

?
1
2
var  url=http: //hostname:[port]/xxx/checkcode.php?rnd=Math.random();
img.src=url 。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值