Что бы вы ни делали, будьте осторожны с кэшированием на стороне клиента:
Браузеры делают все возможное, чтобы свести к минимуму пропускную способность, и в протоколе HTTP есть много способов сделать это, каждый из которых обрабатывается apache - если вы просто обслуживаете локальный файл.
Если нет, то это ваша ответственность .
Взгляните хотя бы на ETag и механику If-Modified-Since, которые поддерживаются всеми современными браузерами и, кажется, являются наиболее надежным способом запрашивать обновленный контент на сервере.
Возможный способ предоставления CSS-файла браузерам, использующим заголовок If-Modified-Since-Header, выглядит примерно так (пустые заголовки для отключения любых не кэшируемых заголовков, которые PHP отправляет по умолчанию):
$p = 'path/to/css/file'
$i = stat($p);
if ($_SERVER['HTTP_IF_MODIFIED_SINCE']){
$imd = strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']);
if ( ($imd > 0) && ($imd >= $i['mtime'])){
header('HTTP/1.0 304 Not Modified');
header('Expires:');
header('Cache-Control:');
header('Last-Modified: '.date('r', $i['mtime']));
exit;
}
}
header('Last-Modified: '.date('r', $i['mtime']));
header('Content-Type: text/css');
header('Content-Length: '.filesize($p));
header('Cache-Control:');
header('Pragma:');
header('Expires:');
readfile($p);
В коде будет использоваться заголовок if-updated-since-header, отправляемый браузером, чтобы проверить, изменился ли фактический файл на сервере с даты, указанной браузером. Если это так, файл отправляется, в противном случае возвращается 304 Not Modified, и браузер не должен повторно загружать весь контент (и, если он достаточно интеллектуален, он также сохраняет проанализированный CSS в памяти).
Существует еще один механизм, включающий в себя отправку сервером уникального заголовка ETag для каждого фрагмента контента. Клиент отправит его обратно, используя заголовок If-None-Match, позволяющий серверу принять решение не только о дате последней модификации, но и о самом контенте.
Это только делает код более сложным, поэтому я оставил его. FF, IE и Opera (возможно, также Safari) отправляют заголовок If-Modified-Since, когда они получают контент с присоединенным заголовком Last-Modified, так что это прекрасно работает.
Также следует помнить, что определенные версии IE (или JScript-Runtime, которые он использует) все еще имеют проблемы с содержимым, передаваемым GZIP.
О. И я знаю, что это не часть вопроса, но и Acrobat в некоторых версиях. У меня были случаи и случаи белых экранов при подаче PDF-файлов с кодировкой передачи gzip.