Вот так это выкручивал у себя...
<FilesMatch "\.(html|htm|shtml)$">
Header set Cache-Control "private max-age=259200, must-revalidate"
</FilesMatch>
<FilesMatch "\.(css|js|jpg|jpeg|gif|png|ico|cur|swf|woff|ttf|eot|webp|svg)$">
Header set Cache-Control "private max-age=15552000, must-revalidate"
</FilesMatch>
<FilesMatch "\.(pdf|doc|docx|xls|rtf|zip|gzip|bzip|rar)$">
Header set Cache-Control "no-store, no-cache, must-revalidate, post-check=0, pre-check=0"
</FilesMatch>
Но у меня связка Apache + NGINX, поэтому в конфиге виртуального хоста nginx (у вас доступа к нему может не быть, у меня не хостинг, а свой сервер с несколькими виртуальными хостами), прописано и такое:
location ~* ^.+\.(css|js)$ {
root "%hostdir%";
rewrite ^(.+)\.(\d+)\.(css|js)$ $1.$3 last;
expires 365d;
}
location ~* ^.+\.(jpg|jpeg|gif|png|ico|cur|swf|woff|ttf|eot|webp|svg)$ {
root "%hostdir%";
expires 365d;
}
location ~* ^.+\.(pdf|doc|docx|xls|rtf|zip|gzip|rar|bzip)$ {
root "%hostdir%";
expires off;
}