Also pay close attention to the caching headers of your resources! The best approach we came up at our work was to:
1. Set the “Expires” header to something far in the future (say, a year);
2. To the URL of the resource append a timestamp parameter, like “something.css?ts=123456789”, where the timestamp is the last change time of the resource.

The webserver will ignore the timestamp parameter, but the browser will cache the resource with it and not request it again. When the resource changes, the timestamp will change too and the browser will request the resource anew.

Of course, adding this to an existing system can be difficult, depending on how many places you need to change.