Повышаем скорость индексирования сайта. Внедрить поддержку обрабатывать HTTP-заголовок If-Modified-Since в Битрикс

Рейтинг: 58.1462  
На голосовании
Предложил Винниченко Константин 30.06.2013 23:01:45

Повышаем скорость индексирования сайта. Внедрить поддержку обрабатывать HTTP-заголовок If-Modified-Since в Битрикс

В поисковых системах говорят о повышении скорости индексации и снижении нагрузки на сервер путем формирования правильных заголовков Last-Modified и If-Modified-Since, цитирую:


Google: Руководство для веб-мастеров
Убедитесь, что ваш веб-сервер поддерживает HTTP-заголовок If-Modified-Since. Этот заголовок позволит веб-серверу сообщать Google, изменилось ли содержание сайта со времени последнего сканирования. Поддержка данной функции сократит нагрузку на пропускную способность и издержки.

Яндекс: Советы вебмастеру
Следите за корректностью http-заголовков. В частности, важно, содержание ответа, который сервер отдает на запрос if-modified-since. Заголовок Last-Modified должен отдавать корректную дату последнего изменения документа. Если сервер не выдает дату последней модификации документа, ваш сайт будет проиндексирован, но:
- в результатах поиска не будет показываться дата рядом со страницами вашего сайта;
- при сортировке по дате сайт не будет виден большинству пользователей;
- робот не сможет получить информацию о том, обновилась ли страница сайта с момента последнего индексирования. А так как число страниц, получаемых роботом с сайта за один заход, ограничено, изменившиеся страницы будут переиндексироваться реже.

В общем надеюсь вы понимаете на сколько это критично и был слегка шокирован, что такая система как CMS-Битрикс не обрабатывает эти заголовки.

Проверить результат можно здесь http://last-modified.com/ru/if-modified-since.html

Нечто подобное можно организовать 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, изменился обновить запись в БД. Если очень большие трудности, то хотя бы реализовать первый не полнофунциональный вариант (для статичного контента).

Рейтинг: 1.3671  
Винниченко Константин 14.03.2014 17:42:39
Мне хотелось бы узнать, будет ли эта задача реализована?
Рейтинг: 0.0817  
Семашко Евгений 14.10.2014 15:21:27
Да, мне тоже. Это очень важная вещь. Хотя вот у меня с таким кодом как сверху, ничего не получилось сделать. Страница отдавала 304 и вообще не открывалась, это в хроме было. Возможно, из-за того, что не было локальной копии закэшированной. Сложно сказать почему именно, во всяком случае пока.
Рейтинг: 0  
Police King 11.04.2015 18:17:29
Рейтинг: -0.2572  
Присяжнюк Юлиана 10.06.2015 14:43:40
а http://1c-bitrix.ru тест проходит
Рейтинг: -0.0092  
Павленко Роман 04.12.2015 13:04:01
Сайт битрикса тоже тест не проходит: не обрабатывает If-Modified-Since.