Не помню что бы где-то в движке были конкретные действия для обработки
If-Modified-Since, даже не знаю что это если честно

я тоже не знал, сайт стал искать почему новое на сайте Яндекс медленно читает, а он все подряд страницы видит как вновь созданные, отдает текущую дату.
смысл в общем в том, что при первом обращении браузера к странице он запрашивает Last-Modified, а второй раз к той же странице - запрашивает If-Modified-Since, и если не менялось, должен отдать код 304, тогда браузер берет у себя из кеша, ну и поисковики при индексации этим активно пользуются
Почитал, в теории это выглядит примерно так:
// Получаем время последней модификации кэш-файла
$lastModified = filemtime($cache->_file);
// Выдаём заголовок HTTP Last-Modified
header('Last-Modified: ' . gmdate('D, d M Y H:i:s', $lastModified). ' GMT');
// Получаем заголовки запроса клиента – только для Apache
$request = getallheaders();
if (isset($request['If-Modified-Since'])) {
// Разделяем If-Modified-Since (Netscape < v6 отдаёт их неправильно)
$modifiedSince = explode(';', $request['If-Modified-Since']);
// Преобразуем запрос клиента If-Modified-Since в таймштамп
$modifiedSince = strtotime($modifiedSince[0]);
} else {
// Устанавливаем время модификации в ноль
$modifiedSince = 0;
}
// Сравниваем время последней модификации контента с кэшем клиента
if ($lastModified <= $modifiedSince) {
// Разгружаем канал передачи данных!
header('HTTP/1.1 304 Not Modified');
exit();
}
?>
Накопал в 1.3.0.4 по поиску "304" такие файлы:
includes\libraries\cache\handler\
page.phpfunction checkNotModified($send304=true) {
$client_etag = isset($_SERVER['HTTP_IF_NONE_MATCH'])? stripslashes($_SERVER['HTTP_IF_NONE_MATCH']) : false;
$client_last_modified = isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])? stripslashes($_SERVER['HTTP_IF_MODIFIED_SINCE']) : false;
if(($client_etag==false)&&($client_last_modified==false))
return false;
$notmodified = false;
$etag = '"'.$this->_hash.'"';
if(($client_last_modified!==false)&&(($pos=strpos($client_last_modified,';'))!==false))
$client_last_modified=substr($client_last_modified,0,$pos);
if($client_etag===$etag)
$notmodified = true;
elseif(($client_last_modified!==false)&&(strtotime($client_last_modified) == $this->_content_modified))
$notmodified = true;
if($notmodified && $send304) {
@ob_clean();
$http1x = isset($_SERVER['SERVER_PROTOCOL'])? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.x';
if(strcmp(PHP_VERSION,'PHP 4.3.0')>=0)
header($http1x.' 304 Not Modified',true,304);
else
header($http1x.' 304 Not Modified');
header('Status: 304 Not Modified');
header('ETag: '.$etag);
exit(0);
}
return $notmodified;
}
function setModified() {
$this->_content_modified = time();
}
\includes\domit\
php_http_status_codes.phpclass php_http_status_codes {
var $codes;
function php_http_status_codes() {
$this->codes = array(200 => 'OK',201 => 'CREATED',202 => 'Accepted',203 =>
'Partial Information',204 => 'No Response',301 => 'Moved',302 => 'Found',303 =>
'Method',304 => 'Not Modified',400 => 'Bad Request',401 => 'Unauthorized',402 =>
'PaymentRequired',403 => 'Forbidden',404 => 'Not found',500 => 'Internal Error',
501 => 'Not implemented',502 => 'Service temporarily overloaded',503 =>
'Gateway timeout');
}
function getCodes() {
return $this->codes;
}вроде все красиво, должно работать. Установлен easy SEF еще, начал на него думать, но не очень понимаю как он вообще работает.
Глянул еще в XML карту sitemap, даты там левые, на большей части страниц стоит дата создания самой карты, т.е. текущая.
Такое чувство, что чего-то с кешем.... будем искать