Conversely, which headers cause a browser to contact the server the next time around to check if the cached file is still valid?
Cache-Control:max-age=14400
Content-Length:1375502
Content-Type:application/json
Date:Wed, 04 Feb 2015 20:51:47 GMT
ETag:"b88aa553-6456-4844-b5bc-173ad8b9e0a1"
Above headers are from the original request. When I re-request it, I get a 304.
See RFC 7234: Hypertext Transfer Protocol (HTTP/1.1): Caching, section 4.2. Freshness:
A fresh response is one whose age has not yet exceeded its freshness lifetime. Conversely, a stale response is one where it has.
A response's freshness lifetime is the length of time between its generation by the origin server and its expiration time. An explicit expiration time is the time at which the origin server intends that a stored response can no longer be used by a cache without further validation, whereas a heuristic expiration time is assigned by a cache when no explicit expiration time is available.
A response's age is the time that has passed since it was generated by, or successfully validated with, the origin server.
When a response is "fresh" in the cache, it can be used to satisfy subsequent requests without contacting the origin server, thereby improving efficiency.
The primary mechanism for determining freshness is for an origin server to provide an explicit expiration time in the future, using either the Expires header field (Section 5.3) or the max-age response directive (Section 5.2.2.8).
Emphasis mine.