23 дек. 2008 г.

Last-modified и обработка if-modified-since в php

Опишу решение, призваное сообщать поисковикам и браузерам, что страница не менялась и заново её загружать не нужно. Не так давно столкнулся с тем, что гугл и яндекс часто заходят на страницы сайта, которые не менялись, в то время, как по новым ссылкам не проходят. Заключил, что за сессию суточного скана бот исчерпывает лимит скачиваемых страниц и уходит. В файле sitemap я указал наиболее приоритетной главную страницу и несколько внутренних, вот с них-то обычно и начиналось сканирование сайта и до новых страниц зачастую не доходило. Решил проблему добавлением корректной обработки заголовков HTTP If-modified-since и Last-modified. Итак, в качестве пример приведу стандартную ситуацию: главная страница сайта содержит последнюю новость, и ссылки на другие разделы сайта, добавляемые вручную (для примера) в шаблон. Значит дата последнего изменения страницы - это максимальная дата из дат изменения новостей или шаблона. Оговорюсь сразу, что в HTTP принят определённый формат дат, так что надо позаботиться о корректной выдаче даты.
$news_modified = CNews::getLastDate()  // Некий метод, получающий дату последнего изменения новостей
$template_modified = filemtime('some_templates_dir/some_template.tpl');  // Получение даты последнего изменения файла шаблона
$modified = gmdate("D, d M Y H:i:s",$md)." GMT"; // Приведение к HTTPшному формату RFC 822

$hdr = isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])?$_SERVER['HTTP_IF_MODIFIED_SINCE']:'' ; //Получение заголовка If-modofied-since в случае его наличия

if ($hdr === $modified) {
// Если даты совпадают, то контент не отдаём
  header ("HTTP/1.1 304 Not Modified ");
header ("Last-Modified: $modified");
header ("Expires:");
header ("Cache-Control:");
exit();
}
header ("Last-Modified: $modified");
header ("Expires:");
header ("Cache-Control:");
Обратите внимание, что проверка делается не на "меньше либо равно", а именно на равенство дат, ибо на клиенте может храниться только дата, которую мы передавали ему ранее в заголовке Last-modified. После введения такой обработки индексация подскочила за неделю до 90%, тогда как до этого была равна 80%. Все вышеописанное делалось на проекте bookcare.ru

2 комментария: