官术网_书友最值得收藏!

最佳實(shí)踐9:理解HTTP協(xié)議中的緩存控制:服務(wù)器端緩存控制頭部信息

HTTP協(xié)議采用客戶端請求(Request)、服務(wù)器端響應(yīng)(Response)的模型。在請求和響應(yīng)中,都能通過相關(guān)控制指令對對端的緩存行為進(jìn)行管理。首先需要關(guān)心的是,服務(wù)器端響應(yīng)中的緩存控制頭部,利用這些頭部控制信息可以精細(xì)化地管理客戶端的緩存行為。

下面使用wget命令來看一個(gè)簡單的例子。

#  wget -S http://10.1.6.28/test.jpg #使用-S參數(shù),指定顯示響應(yīng)頭部信息
--2016-01-08 15:47:29--  http://10.1.6.28/test.jpg
Connecting to 10.1.6.28:80... connected.
HTTP request sent, awaiting response... 
  HTTP/1.1 200 OK
  Server: nginx/1.9.7
  Date: Fri, 08 Jan 2016 07:47:28 GMT
  Content-Type: image/jpeg
  Content-Length: 20305
  Last-Modified: Fri, 08 Jan 2016 07:25:26 GMT ①
  Connection: keep-alive
  ETag: "568f6466-4f51" ②
  Expires: Sat, 09 Jan 2016 07:47:28 GMT ③
  Cache-Control: max-age=86400 ④
  Accept-Ranges: bytes
Length: 20305 (20K) [image/jpeg]
Saving to: `test.jpg'

100%[===================================================================================================>] 20,305      --.-K/s   in 0s      

2016-01-08 15:47:29 (137 MB/s) - `test.jpg' saved [20305/20305]

在該實(shí)例中,服務(wù)器端使用到了4個(gè)指令來控制緩存。

·Last-Modified:Fri,08 Jan 201607:25:26 GMT表示該文件的最后修改時(shí)間是Fri,08 Jan 201607:25:26 GMT。客戶端在后續(xù)需要請求該文件時(shí),使用對應(yīng)的請求頭部If-Modified-Since:Fri,08 Jan 201607:25:26 GMT就可以驗(yàn)證服務(wù)器端文件是否發(fā)生變化。可以使用如下命令進(jìn)行驗(yàn)證:

wget --header='If-Modified-Since: Fri, 08 Jan 2016 07:25:26 GMT' -S http://10.1.6.28/test.jpg

如服務(wù)器端文件未在此時(shí)間后發(fā)生變化,則服務(wù)器端不需要重新發(fā)送整個(gè)文件,而只需要發(fā)送“304 Not Modified”通知客戶端即可。此時(shí)可以節(jié)省傳輸該文件的帶寬和時(shí)間。

·ETag:"568f6466-4f51"相當(dāng)于該靜態(tài)資源的身份ID。在Web服務(wù)器Nginx中,ETag的值是基于文件的最后修改時(shí)間(時(shí)間戳)和文件大小(字節(jié))計(jì)算出來的。瀏覽器在下一次請求該資源的過程中,使用If-None-Match:"568f6466-4f51"即可確認(rèn)該資源是否發(fā)生了變化。服務(wù)器端再次驗(yàn)證,如果未變化,則直接返回給客戶端HTTP/1.1304 Not Modified,而不需要再次傳輸整個(gè)文件,起到緩存的效果。如下所示:

#  wget --header='If-None-Match: "568f6466-4f51"' -S http://10.1.6.28/test.jpg
--2016-01-08 15:59:14--  http://10.1.6.28/test.jpg
Connecting to 10.1.6.28:80... connected.
HTTP request sent, awaiting response... 
  HTTP/1.1 304 Not Modified
  Server: nginx/1.9.7
  Date: Fri, 08 Jan 2016 07:59:14 GMT
  Last-Modified: Fri, 08 Jan 2016 07:25:26 GMT
  Connection: keep-alive
  ETag: "568f6466-4f51"
  Expires: Sat, 09 Jan 2016 07:59:14 GMT
  Cache-Control: max-age=86400
2016-01-08 15:59:14 ERROR 304: Not Modified.

·Expires:Sat,09 Jan 201607:47:28 GMT即服務(wù)器端通知客戶端,在Sat,09 Jan 201607:47:28 GMT之前需要獲取該資源時(shí),不必再發(fā)起HTTP請求,直接使用這個(gè)緩存文件即可。

·Cache-Control:max-age=86400即服務(wù)器端通知客戶端,你自收到這個(gè)文件起的86400秒內(nèi),都可以放心使用,不必再重復(fù)請求這個(gè)URL。

注意

是對同一個(gè)意思的兩種表示,前一個(gè)是絕對時(shí)間,后一個(gè)是相對時(shí)間。這兩個(gè)指令同時(shí)使用時(shí),max-age優(yōu)先起作用,因?yàn)橛袝r(shí)客戶端和服務(wù)器端的時(shí)鐘并不完全一致,有時(shí)甚至差別較大,故使用相對值更加合理。

主站蜘蛛池模板: 府谷县| 贞丰县| 米脂县| 尼勒克县| 新津县| 宝山区| 韩城市| 常德市| 建平县| 砚山县| 晋江市| 昂仁县| 江源县| 桐城市| 渭南市| 北碚区| 甘洛县| 通州市| 绥芬河市| 凉城县| 光泽县| 仁寿县| 临清市| 礼泉县| 久治县| 寻乌县| 简阳市| 鹰潭市| 新乡县| 桃园市| 宽城| 陆丰市| 嘉峪关市| 新野县| 余庆县| 志丹县| 额尔古纳市| 乐安县| 金昌市| 报价| 大关县|