Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Http 304 & Cache-Control: no-cache

I'm seeing the below response from some calls to a webserver:

Initial call:

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

Subsequent calls:

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

What I'm unclear about is that both calls return a Cache-Control: no-cache directive to the browser.

However, the second call also returns a 304 Not Modified.

Where does the server expect the page to serve the data from, given that it's been instructed not to cache the earlier response?

Interestingly, I do see the response served in the browser, so the browser appears to have cached the response, despite the no-cache directive. Why?

like image 425
Marty Pitt Avatar asked Jan 16 '12 05:01

Marty Pitt


1 Answers

A response with Cache-Control: no-cache does not mean that the response must not be stored at the client at all, instead it means:

If the no-cache directive does not specify a field-name, then a cache MUST NOT use the response to satisfy a subsequent request without successful revalidation with the origin server. This allows an origin server to prevent caching even by caches that have been configured to return stale responses to client requests.

So the client is allowed to store the response in the local cache but it needs to revalidate the response by the origin server. If the server says that the response stored in the client’s cache is still valid (i. e. 304 response), the client is allowed to use the stored response to satisfy the request.

like image 95
Gumbo Avatar answered Sep 22 '22 13:09

Gumbo