For most locations I would have thought this level of caching would now be unecessary.
It still goes on . . .proxy servers etc . . . the down side is not only do customers not understand this stuff, they don't want to know.
This is a never ending battle with customers. Page headers **usually** work but it relies on the client (browser) to do what you tell it, and in the case of <cough> "some browsers" it doesn't always. The only sure way is to configure the server to send cache expire headers, which a) is not always possible and b) forces all pages to load uncached, which may slow the browsing experience for your visitors. Lose-lose.
For images, CSS and other included resources, it's easy.
<link rel="stylesheet" type="text/css" href="mycss.css?67876858">
You just add a query string with some unique number after it and the browser is forced to download a new resource. Many dynamically output sites use this method and the number is always different on every page load. Since these are static resources, nothing really happens with the query string, it just gets tossed out.
However, this is a very bad idea
for the page itself as it will affect how it indexes, any links to it would now change.
When I make updates to static files, almost without thinking, I include this line: "... if you don't see the changes, hold down the CTRL key on your keyboard (Apple for Mac) and press F5, this will force an uncached download of the page."
Path of least resistance. :-)