Grundsätzlich gibts mehrere Möglichkeiten.
Viele Web2.0-Dinger wie StudiVZ nutzt tatsächlich die erste Variante, da gibts für jede Version der Static-Module einen eigenen Pfad. Das ist da schon wegen dem CDN dahinter sinnvoll.
Bei JS wird das gerne gemacht, dass man einen Dummy-Parameter an das src-Attribut dran hängt. Umgeht einen Bug im Caching-Verhalten alter WebKits.
Normalerweise gibts dafür aber spezielle Request-Header, mit denen der Browser sagt "nicht senden, wenn nicht geändert seit $Datum" oder "wenn ETag noch gleich $foo". Das nutzen wir, aber irgendwas will da nicht.
Manche Dateien bleiben hängen, und werden trotz richtig erkannter neuer Version nicht neu übertragen, und das seht ihr dann als Cache-Probleme.
Und zumindest ich hab keine Ahnung, warum das so ist
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."