this can be done by automatically adding a rotated ID to the files in question in your site code, or more cleanly by expiring the HTTP header (webservers can do that - we do it with nginx, not sure how the command syntax works with Apache)
The most common way I’ve seen it done is, like oinari says, by adding some form of id to the url of the file you’re referencing, and just changing the id every time you update the file.
For example, for version 1 of your stylesheet
<link rel="stylesheet" href="styles.css?v1" />
If you update your stylesheet, you’d simply increment the version number
<link rel="stylesheet" href="styles.css?v2" />
This would force the browser to download the updated stylesheet.
I actually came up with an idea nearly identical to ParticleTree, though I just apply the filemtime as a “ver” parameter: mypage?ver=12345678. Even parameter changes cause it to be redownloaded, so it works really well (with no rewrites required).
We also have files stored on another server which I want to do the same thing with, but filemtime doesn’t work over http. In those cases, you can fopen() the file, then use stream_get_meta() to get it’s meta data and fine the “Last Modified” meta data.