Http Status 304響應狀態的資源更新機制

http請求頭和響應頭能夠避免重複的資源(css,js,圖片,文本等),瀏覽器通常訪問這些靜態資源以後會緩存一段時間,靜態資源通常是不會常常改變的,並且這些資源比較大,比較多的狀況會影響加載效果,因此要避免屢次從網絡加載這些文件。php

一個完整的請求(本文做於2014-11-12,但資源時間是2014-10-30)css

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

服務器響應html

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


瀏覽器資源訪問過程:java

1.當訪問靜態資源文件時,首先使用url hashcode做爲key查詢本地資源緩存。git

2.若是沒找到資源,那麼直接訪問瀏覽器,而後將請求的資源文件緩存並載入到html中。github

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, 

var url=http://hostname:[port]/xxx/checkcode.php?rnd=Math.random();
img.src=url 。
相關文章
相關標籤/搜索