Примерно так:
Запрос вида /css/style.css
обрабатывается неким контроллером, назовём его контроллер CSS.
Т.е. если с сервера запрашивается адрес /css/style.css, на самом деле вызывается php скрипт, в который передаётся аргумент, строка "style.css" (гугли mod_rewrite или единая точка входа).
Далее, в контроллере CSS ты смотришь дату изменения этого файла style.css:
function getModificationTime($path_to_file)
{
return (new Datetime())->setTimestamp(filemtime('/my/style/paths/' . $path_to_file));
}
$modify_date = getModificationTime('styles.css');
Далее, в этом контроллере ты проверяешь, пришёл ли от браузера заголовок HTTP_IF_MODIFIED_SINCE (погугли, что это).
/**
* Возвращает true, если дата (обычно документа) $data является устаревшей
* по отношению к HTTP заголовку If-Modified-Since.
*
* @param $date \DateTime
* @return bool
*/
public static function IfModifiedSince(\DateTime $date): bool
{
if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])) {
$if_modified_since = strtotime(substr($_SERVER['HTTP_IF_MODIFIED_SINCE'], 5));
if ($if_modified_since && $if_modified_since >= $date->getTimestamp()) {
return false;
}
}
return true;
}
если true, считываешь css файл и выплёвываешь его посредством этого контроллера (через echo), отправляя http заголовки, присущие для css ('text/css; charset=utf-8') и заголовок Last-Modified с датой $modify_date в формате "D, d M Y H:i:s \G\M\T"
если false (файл не изменился) просто отдаешь http заголовок 304
----
этой информации тебе достаточно, что бы самостоятельно всё самому реализовать