Http headers can instruct what kind of cache mechanism browser and proxy should obey along the request/response chain. For static resources (Javascript, CSS, images, flash etc), it is suggested to apply cache on browser or proxy side to reduce # of Http requests.
Response Headers:
Cache-Control Tells all caching mechanisms from server to client whether they may cache this object (
public/private to control if browser or proxy cache,
no-store to control if save to disk,
max-age is to control how long to cache)
Expires Gives the date/time after which the response is considered stale (suggested 1 year from now, for aggressive static resource cache)
Date The date and time that the message was sent (It is useful for Expires by date time)
ETag An identifier for a specific version of a resource, often a message digest (Suggest to disable it for performance, or re-configure ETag to remove server specific info. See If-None-Match. ETag takes precedence over Last-Modified if both exist)
Last-Modified The last modified date for the requested object, in RFC 2822 format (for conditional get, 304 Not Modified, see
If-Modified-Since)
Pragma Implementation-specific headers that may have various effects anywhere along the request-response chain. (Http1.0, example is Pragma: no-cache)
Vary Tells downstream proxies how to match future request headers to decide whether the cached response can be used rather than requesting a fresh one from the origin server. (The most common case is to set Vary: Accept-Encoding, so that proxy knows if return cached compressed data to browser)
Request Headers:
Cache-Control Used to specify directives that MUST be obeyed by all caching mechanisms along the request/response chain
If-Modified-Since Allows a 304 Not Modified to be returned if content is unchanged
If-None-Match Allows a 304 Not Modified to be returned if content is unchanged
Pragma Implementation-specific headers that may have various effects anywhere along the request-response chain
Recommendations:
It is important to specify one of
Expires or
Cache-Control max-age, and one of
Last-Modified or
ETag, for all cacheable resources. It is redundant to specify both Expires and Cache-Control: max-age, or to specify both Last-Modified and ETag.
You use the
Cache-control: public header to indicate that a resource can be cached by public web proxies in addition to the browser that issued the request.
Avoiding caching
HTTP version 1.1 -> Cache-Control: no-cache
HTTP version 1.0 -> Setting the Expires header field value to a time earlier than the response time
Reference
http://tools.ietf.org/html/rfc2616
http://en.wikipedia.org/wiki/List_of_HTTP_header_fields
http://code.google.com/speed/page-speed/docs/caching.html#LeverageBrowserCaching
http://code.google.com/p/doctype/wiki/ArticleHttpCaching