суббота, 29 января 2011 г.

If Modified Since и last modified для динамических страниц

Корректно отдавать заголовки Last modified и If Modified Since полезно для индексации сайта поисковыми системами, однако, если контент динамический (php), сервер на любой запрос будет выдавать ответ 200 OK, робот будет считать, что содержимое страницы изменилось, и, возможно, не доберется до реально изменившегося контента. Чтобы отдавать правильные заголовки в динамике, можно воспользоваться решением, которое я использую и проверил в работе. Оно подходит в том случае, если на страницу выводится определенная строка из таблицы Mysql - например, отдельная новость или описание отдельной фирмы в каталоге, а соответствующих плагинов к скрипту нет.


Сначала, само собой, подключаемся к базе - эту часть я опускаю, опытные и так знают, чайники могут скопировать из другого файла своего скрипта.

//Конвертируем дату в человеческий формат
function data_convert ($data, $day=1, $year=1, $time=1, $second=1)
{$month = array ("", "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec");
$day = array ("", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun",);
$res = "";
$part = explode(" " , $data);
$ymd = explode ("-", $part[0]);
$hms = explode (":", $part[1]);
if ($year == 1) {$result .= $ymd[2]; $result .= " ".$month[(int)$ymd[1]]; $result .= " ".$ymd[0];}
if ($time == 1) {$result .= " ".$hms[0]; $result .= ":".$hms[1]; if ($second == 1) $result .= ":".$hms[2];}
return $result;
}
//Вытаскиваем из базы необходимую строчку
$lid=intval($_GET["id"]);

$r2=mysql_query("SELECT DISTINCT название Вашего поля с датой, например insert_date, DAYOFWEEK(insert_date) AS dow
FROM название Вашей таблицы WHERE Условие, например type=1 AND `lid` = $lid ORDER by insert_date DESC") or die(mysql_error());

//Сразу же отдаем заголовок 404 not found, если данные удалены

if (mysql_num_rows($r2)!=1)

{header("HTTP/1.0 404 Not found");
include "404.php";

exit();
}

//Формируем заголовок Last modified
if ($lid > 0)
$row = mysql_fetch_array($r2);
$last_modified = $row["insert_date"];
$last_modified = data_convert ($last_modified, 1, 1, 1);
switch ($row["dow"])
{
case "7":{$dow="Sat"; break;};
case "6":{$dow="Fri"; break;};
case "5":{$dow="Thu"; break;};
case "4":{$dow="Wed"; break;};
case "3":{$dow="Tue"; break;};
case "2":{$dow="Mon"; break;};
case "1":{$dow="Sun"; break;};
};
$last_modified = $dow.", ".$last_modified;

//Отдаем заголовки

header("Last-Modified: $last_modified");
$headers = getallheaders();
if ($headers['If-Modified-Since']>=$last_modified) {
header('HTTP/1.0 304 Not Modified');
exit();
}
else{
header('HTTP/1.0 200 OK');
header("Last-Modified: $last_modified");
}

Собственно говоря, все - таким образом роботы поисковых систем получат корректные заголовки...

0 коммент.:

Отправить комментарий

Подписаться на: Комментарии к сообщению If Modified Since и last modified для динамических страниц