В поисковых системах говорят о повышении скорости индексации и снижении нагрузки на сервер путем формирования правильных заголовков Last-Modified и If-Modified-Since, цитирую: [spoiler]
Google: Руководство для веб-мастеров Убедитесь, что ваш веб-сервер поддерживает HTTP-заголовок If-Modified-Since. Этот заголовок позволит веб-серверу сообщать Google, изменилось ли содержание сайта со времени последнего сканирования. Поддержка данной функции сократит нагрузку на пропускную способность и издержки.
Яндекс: Советы вебмастеру Следите за корректностью http-заголовков. В частности, важно, содержание ответа, который сервер отдает на запрос if-modified-since. Заголовок Last-Modified должен отдавать корректную дату последнего изменения документа. Если сервер не выдает дату последней модификации документа, ваш сайт будет проиндексирован, но: - в результатах поиска не будет показываться дата рядом со страницами вашего сайта; - при сортировке по дате сайт не будет виден большинству пользователей; - робот не сможет получить информацию о том, обновилась ли страница сайта с момента последнего индексирования. А так как число страниц, получаемых роботом с сайта за один заход, ограничено, изменившиеся страницы будут переиндексироваться реже.
В общем надеюсь вы понимаете на сколько это критично и был слегка шокирован, что такая система как CMS-Битрикс не обрабатывает эти заголовки.
Нечто подобное можно организовать PHP скриптом, но это лишь дата изменения самого файла.
<?
// Определяем дату модификации скрипта и выдаем Last-Modified
$last_modified = filemtime($SCRIPT_FILENAME);
header('Last-Modified: ' . gmdate('D, d M Y H:i:s', $last_modified) . ' GMT');
// Пытаемся получить содержимое If-Modified-Since
foreach($_SERVER as $name => $value) {
if($name == 'HTTP_IF_MODIFIED_SINCE')
$modified_since = $value; }
// Пытаемся преобразовать значение в Unix time
if (isset($modified_since)) {
$modified_since = strtotime(preg_replace('/;.*$/', '', $modified_since));
} else {
$modified_since = 0; }
// Сравниваем даты и выдаем заголовок, если требуется
echo $last_modified."<br>";
echo $modified_since;
if ($last_modified <= $modified_since) {
header('HTTP/1.1 304 Not Modified');
exit();
}
?>
Так вот хочу видеть правильную генерацию заголовков!
Какой функционал я бы хотел увидеть?
Первый вариант не полнофункциональный (для статичных страниц): 1) Чтобы в настройках - автокеширование - вкладка "HTML кеш" появилась галочка "Отправлять дату последнего изменения в заголовке ответа (if-modified-since)" с пояснением для других зачем это нужно 2) После попадания в HTML-кеш соответствующих редко изменяемых страниц проверка http://last-modified.com/ru/if-modified-since.html проходила успешно.
Второй вариант: 1) Чтобы в настройках - автокеширование - вкладка "Управляемый ответ" появилась галочка "Отправлять дату последнего изменения в заголовке ответа (if-modified-since)" с пояснением для других зачем это нужно 2) Возможно потребуется новая таблица которая будет хранить - код записи - ссылка - хеш только текста страницы - дата изменения 3) проверочный ХЕШ (не путать с КЕШ) - брать только текст, так как нас интересует оптимизация для поисковых систем 4) если совпадает ХЕШ с ХЕШом в таблице возвращаем дату из таблицы 5) если не совпадает ХЕШ с ХЕШом в таблице возвращаем новую дату и записываем эту дату в таблицу
Как уже было сказано, если реализовать данную вещь, то сайты на системе Битрикс будут быстро индексироваться роботами так как время обхода пауком ограниченно для каждого сайта, а в этом случае он съест больше!
Так же некоторые браузеры не будут загружать повторно страницу а сразу могут открыть свою локальную копию, закешируемая страница будет отрываться молниеносно!
6) В случае чего, можно добавить дополнительное поле в таблицу, дата изменения записи и автоматически очищать устаревшие записи превышающий тот срок который указал пользователь
ВОПРОСЫ И ВОЗРАЖЕНИЯ
Генерируется она для элемента инфоблока. А если элемент находится на странице, то выводить If-Modified-Since для страницы или элемента?
Поисковики индексируют текст, нужно иметь таблицу сохранять весь текст данной страницы и сохранить дату сканирования, изменился текст на ВСЕЙ данной конкретно странице, значит новая дата. Выше все расписал по пунктам.
А если на странице несколько элементов, то чей If-Modified-Since выводить?
Повторяю, мы храним в БД полный готовый текст страницы, если ни один элемент на данной странице не изменялся то выводить If-Modified-Since, изменился обновить запись в БД. Если очень большие трудности, то хотя бы реализовать первый не полнофунциональный вариант (для статичного контента).
Да, мне тоже. Это очень важная вещь. Хотя вот у меня с таким кодом как сверху, ничего не получилось сделать. Страница отдавала 304 и вообще не открывалась, это в хроме было. Возможно, из-за того, что не было локальной копии закэшированной. Сложно сказать почему именно, во всяком случае пока.