'Cache-Control' or Expires
16 September 2005
Dieter Maurer was as kind as he always is one the Zope mailing list and explained to me the difference between using the
Cache-Control and the
Expires header for inducing browsers to cache your web elements. He explains:
Cache control is the modern (HTTP 1.1) way, "Expires" the old (HTTP 1.0) one.
My problem is that I've know about each but never bothered to find out why there are two ways of doing the same thing. In most of my projects I've used the oldschool method of setting RFC822 formatted future dates on the
Expires header, but from now on I'll use both. Dieter continues on my question "What is best to use and for what?":
Use them both:
HTTP 1.1 clients will honour "Cache-Control" (which is easier to use and much more flexible).
HTTP 1.0 clients will ignore "Cache-Control" but honour "Expires". With "Expires" you get thus at least a bit control for these old clients.
Now, let's speak code. Here's what I now do to set caching on my pages when I want to:
def doCache(self, hours=10): """ set cache headers on this request if not in debug mode """ if not self.doDebug(): response = self.REQUEST.RESPONSE now = DateTime() then = now+int(hours/24.0) response.setHeader('Expires',then.rfc822()) response.setHeader('Cache-Control', 'public,max-age=%d' % int(3600*hours))
This I can then use in say a stylesheet like this: