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 。