2012-01-16 65 views
4

我看到一些調用Web服務器的響應如下:的Http 304的Cache-Control:無緩存

初始呼叫:

HTTP/1.1 200 OK 
Date: Mon, 16 Jan 2012 05:46:49 GMT 
X-Powered-By: Servlet/2.5 JSP/2.1 
Content-Type: text/plain 
Content-Length: 78 
Content-Encoding: gzip 
Etag: "pv2052dae8634d971149a927231e3ceddf" 
Cache-Control: no-cache 
X-PvInfo: [S10202.C6191.A6057.RA6008.G182D.U3FAE8760].[OT/plaintext.OG/documents] 
Vary: Accept-Encoding 
Set-Cookie: JSESSIONID=l9pLPT5J1tpgK19Fq2qlT0F15ryByWDLgVLz16ffWPm4qQp6nzzx!-518520380; path=/; HttpOnly 
DST=rd319o00000000000000000000ffffac16018bo8200; path=/ 
Connection: close 

後續調用:

HTTP/1.1 304 Not Modified 
Date: Mon, 16 Jan 2012 05:48:43 GMT 
Connection: close 
Etag: "pv2052dae8634d971149a927231e3ceddf" 
Cache-Control: no-cache 
Vary: Accept-Encoding 

我不清楚的是這兩個調用返回Cache-Control: no-cache指令到瀏覽器。

但是,第二次調用還返回304 Not Modified

服務器期望頁面爲數據提供服務,因爲它已被指示不緩存早期響應?

有趣的是,我看到在瀏覽器中提供的響應,所以瀏覽器似乎緩存了響應,儘管沒有緩存指令。爲什麼?

+0

請爲第一個請求和後續請求發佈請求頭。您將看到瀏覽器發送給webserver.Cache-Control:no-cache意味着web服務器指示瀏覽器不緩存響應主體。 – rkosegi 2012-01-16 06:08:11

回答

16

一個response with Cache-Control: no-cache並不意味着響應不得存儲在客戶端可言,相反,它的意思是:

如果no-cache指令沒有指定字段名,然後 緩存不得使用該響應來滿足後續請求 ,而不對源服務器進行成功的重新驗證。這個 允許源服務器甚至通過配置緩存來防止緩存,以便將陳舊響應返回給客戶端請求。

因此,允許客戶端將響應存儲在本地緩存中,但它需要重新驗證源服務器的響應。如果服務器說存儲在客戶端緩存中的響應仍然有效(即304響應),則允許客戶端使用存儲的響應來滿足請求。

+1

很好的解釋。如何告訴服務器_not_不返回Cache-Control指令? IE我不希望客戶端重新驗證服務器? – 2012-06-22 09:27:22