The server needs to respond with a Vary header which tells the user agent (the browser) how to identify what it should cache.
[1]https://developer.mozilla.org/en/HTTP/Content_negotiation
[1]https://developer.mozilla.org/en/HTTP/Content_negotiation
Think of all the different "Accept" headers that clients can send you, each one of these will get an entry in your cache. And now add other headers that should also be in "Vary" like "Cookies", "Accept-Language", etc. and your cache will be virtually useless.