I am running PHP on Apache, and am confused about how to implement server-side caching, in order to make the site load faster.
What is the difference between the Expires
, Last-Modified
and ETag
headers, and which one should be used in what situation?
You can use the Expires
header in conjunction but regardless of the other two. It's universally supported by proxies and browser caches.
The difference between ETag
and Last-Modified
stamps is more semantic. ETags are opaque to clients. It's usually a checksum. Whereas a Last-Modified header can be interpreted by clients. It's understood that the last modified timestamp works linearly.
If a browser requests a resource with If-Unmodified-Since
, then a wide range of timestamps in the past can match such a condition. If your pages change frequently then a Last-Modified timestamp might be advantageous.
The ETag approach, on the other hand, leads to clients that save one last fingerprint per resource. (I'm not sure if browser caches remember multiple ETags). On requests, only one or a few possible If-None-Match
tokens are listed. This might mean more misses. Also, you have to compare multiple checksums, whereas with a Last-Modified timestamp you could have an arithmetic comparison.
The real advantage of ETags is that you can reliably compare fingerprints. The Last-Modified timestamps are a bit more vague, as they don't verify if the actual page content changed.
See also: