Если бы я мог немного улучшить первоначальный блестящий ответ Рича Брэдшоу https://stackoverflow.com/users/16511/rich-bradshaw
Этот код изменен, и теперь 100% проходит проверки If-Modified-Since и If-None-Match. Он также правильно форматирует дату последнего изменения, так как оригинальный ответ отправляет +0000 в конце вместо GMT и добавляет заголовок VARY к ответу 304. Вы можете проверить это на redbot.org
<?php
function caching_headers ($file, $timestamp) {
$lastModified=filemtime($_SERVER['SCRIPT_FILENAME']);
$gmt_mtime = gmdate("D, d M Y H:i:s T", $lastModified);
header('ETag: "'.md5($timestamp.$file).'"');
header('Last-Modified: '.$gmt_mtime);
header('Cache-Control: must-revalidate, proxy-revalidate, max-age=3600');
if(isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) || isset($_SERVER['HTTP_IF_NONE_MATCH'])) {
if ($_SERVER['HTTP_IF_MODIFIED_SINCE'] == $gmt_mtime || str_replace('"', '', stripslashes($_SERVER['HTTP_IF_NONE_MATCH'])) == md5($timestamp.$file)) {
header('HTTP/1.1 304 Not Modified');
header("Vary: Accept-Encoding,User-Agent");
exit();
}
}
}
caching_headers ($_SERVER['SCRIPT_FILENAME'], filemtime($_SERVER['SCRIPT_FILENAME']));
?>