[OpenLayers-Dev] Caching layerimages by browsers

Tim Schaub tschaub at opengeo.org
Thu Mar 4 14:06:11 EST 2010


Dipl. Inf. Carsten Eider wrote:
> Hi list,
> while examining my WMS-Servers logs i was surpprised by the amount of
> WMS-requests I found within.
> Using Firefox and Firebug i recognized, that the tiles were not cached
> by the browser, i.e.
> each time they came into the viewport of the map they were re-requested!
> Is there a way to use cached images by the browser instead of requesting
> them time and again?

Caching is best controlled by using the appropriate headers in your 
server responses.

If your server responds with an Expires header, we can't force the 
browser to use a cached image (without essentially rewriting our own 
cache) if the Expires date has been reached.

If your server (or gateway cache) uses Etag or Last-Modified headers, 
the browser will try to make requests with If-None-Match or 
If-Modified-Since headers.  If the server responds with 304, Not 
Modified, the browser will pull from its cache.

Looking at the http://openlayers.org/dev/examples/example.html example, 
you can see Etag headers on the static images (west-mini.png etc.).  The 
GetMap responses from openlayers.org contain Expires headers 
corresponding to the request time (so they immediately expire).  The 
GetMap responses from www2.dmsolutions.ca don't contain any cache 
related headers.

When you refresh the page, requests for static images return 304, Not 
Modified, and the browser pulls those from its cache.  Previous 
responses for GetMap images make the browser think those should not be 
cached, so they are requested with Cache-Control: max-age=0.  We can't 
override the headers in this case, so if your server obeys, it will do 
whatever it does to generate new GetMap responses.

So, you can improve the caching situation by having your server (or 
gateway cache) use appropriate headers on responses.  If you configure a 
gateway cache like Varnish or Squid in front of your WMS, this should be 
handled for you.  If you use a tile generator to pre-seed a tile cache 
and serve those statically, you can configure your server to use 
Last-Modified headers.  If you are confident that you won't be updating 
static images, use future Expires headers to avoid the intermediate 
request with If-None-Match or If-Modified-Since headers.

The short story is that for image requests and effectively using the 
browser's cache, OpenLayers isn't the place to make changes.

Oh, and re-reading your question, I see you were talking about 
panning/zooming instead of reloading the page.  The same advice applies, 
with the additional note that your browser cache can eventually fill up. 
  I think the default configuration for Firefox is 50MB.

Hope that is some help.

> Carsten
> ------------------------------------------------------------------------
> _______________________________________________
> Dev mailing list
> Dev at openlayers.org
> http://openlayers.org/mailman/listinfo/dev

Tim Schaub
OpenGeo - http://opengeo.org
Expert service straight from the developers.

More information about the Dev mailing list