Блог в котором есть много интересной информации…. Заголовок Last-Modified, Symfony и ускорение поисковой индексации

Один из этапов оптимизации интернет-сайта для его правильной работы и успешного продвижения — оптимизация на стороне сервера. Среди прочих моментов — настройка правильного ответа сервера на запрос «Last-Modified». Правильная настройка этого параметра может повлиять на увеличение скорости загрузки сайта и положительно скажется на его индексации поисковыми роботами.

Что такое Last-Modified и зачем он нужен?

Как видно из названия, заголовок Last-Modified говорит клиенту (посетителю сайта) о времени последнего изменения той или иной страницы сайта. Если в качестве посетителя сайта выступает поисковый робот и на сайте (на сервере) не настроен (или настроен неправильно) ответ Last-Modified на запрашиваемый документ или страницу, поисковому роботу ничего не остается, как производить индексацию всех страниц интернет-ресурса снова и снова при каждом посещении, таким образом создавая определенную нагрузку на сервер, расположенный на хостинг-площадке. А если количество страниц сотни или даже тысячи? В зависимости от характеристик и возможностей и сервера, существует вероятность «нарваться» на какую-нибудь ошибку со стороны хостинга. В дополнение к этому следует отметить, что поисковый робот имеет лимит на количество индексируемых «за раз» страниц, поэтому в случае отсутствия правильной настройки заголовка Last-Modified, мы рискуем тем, что неизмененные страницы проиндексируются роботом, а нужные нам новые страницы — нет.

Исходя из спецификации RFC 2616, описывающей протокол передачи гипертекста HTML, клиент может «спросить» у сервера, не изменилась ли страница с определенной даты, послав серверу заголовок «If-Modified-Since». Если запрашиваемая страница не изменилась, сервер возвратит заголовок «304 Not Modified» и браузер не будет загружать страницу, а web-сервер не будет отдавать много данных. В противном случае (если страница сайта изменялась со времени предыдущего запроса), сервер возвратит ответ «200 OK» и непосредственно код самой страницы.

В дополнение к вышесказанному упомянем рекомендации Яндекса: «Робот не сможет получить информацию о том, обновилась ли страница сайта с момента последнего индексирования. А так как число страниц, получаемых роботом с сайта за один заход, ограничено, изменившиеся страницы будут переиндексироваться реже» .

ИТОГО: важным назначением заголовка «Last-Modified» служит информирование посетителя сайта и поискового робота о дате последней модификации какого-либо документа.

Для чего нужна правильная настройка Last-Modified?

При помощи правильной настройки ответа сервера Last-Modified мы сможем достичь сразу несколько положительных результатов для нашего сайта:

  • Увеличивается скорость загрузки страницы сайта для людей: в случае, если страница уже была посещена пользователем и на момент следующего посещения страница не менялась, браузер посетителя не будет заново загружать страницу, а отобразит ее сохраненную в кеше копию;
  • Снижается нагрузка на хостинг-площадку (сервер): при таком алгоритме работы сервер будет загружаться гораздо меньше за счет необходимости передачи посетителю сайта объема только измененных страниц;
  • Отображается дата последнего документа в поисковой выдаче: этот факт может привлекать посетителей к вашему сайту, если будет отображаться «свежая» дата;
  • Сортировка по дате: страницы сайта примут участие в сортировке по дате в поисковой выдаче;
  • Существенно ускоряется индексация сайта поисковыми роботами: за счет быстрого ответа вашего сайта о дате сканируемых страниц, старые (уже проиндексированные) страницы будут «отбрасываться в сторону», уступая место «свежим» документам. Этот пункт является наиболее значимым при продвижении сайта , т.к. высокая скорость индексации повышает уровень доверия к сайту у поисковых роботов.

Как проверить, корректно ли настроен Last-Modified?

Один из сервисов, на котором можно проверить правильность (да и вообще существование) настроенного ответа сервера Last-Modified - одноименный last-modified.com

В поле ввода необходимо написать адрес вашего сайта или конкретной страницы и нажать на кнопку «Проверить». Результатом работы сервиса будет демонстрация ответа вашего сайта на запрос заголовков «Last-Modified» и «304 Not Modified». Пример такой проверки:

Настраиваем Last-Modified

Рассмотрим реализацию ответа HTTP-заголовка Last-Modified на PHP.

В интернете очень часто встречаются такие рекомендации по настройке Last-Modified:

Так и хочется воскликнуть: «Такой хоккей нам не нужен!» И давайте разберемся почему. В ответ на запрос пользователя функция gmdate вернет нам текущую дату по Гринвичу (GMT). И так будет происходить каждый раз при каждом запросе пользователя или поискового робота — сервер будет возвращать нам именно свою текущую дату . Получается, что при каждом посещении вашего сайта поисковиками, они будут видеть, что запрашиваемая страница только что обновлена. Это может быть «полезным» лишь несколько раз... Через некоторое время поисковик поймет, что его «дурят» и утратит какое-либо доверие к вашему сайту. Соответственно, такая реализация нам не подходит.

Обратимся за помощью к вышеупомянутому ресурсу last-modified.com . На нем также представлен вариант реализации HTTP-заголовка Last-Modified на PHP. Выглядит он следующим образом:

$LastModified_unix = 1294844676;

$IfModifiedSince = false;



if ($IfModifiedSince && $IfModifiedSince >= $LastModified_unix) {
exit;
}

Давайте разберем работу этого кода. Переменная $LastModified_unix задается вручную в формате Unix Time Stamp (число секунд, прошедших с начала эпохи Юникс - с 1 января 1970 года).

Функция gmdate возвращает текущее время по Гринвичу в формате Day, DD Mon YEAR HH:MM:SS GMT .

Далее: получаем время последнего изменения страницы, проверяем наличие If-Modified-Since , если есть - отдаем 304 Not Modified и останавливаем работу скрипта. В противном случае генерируем заголовок Last-Modified и отдаем страницу целиком.

В указанном выше варианте предлагается задавать время $LastModified_unix вручную. А что делать, если на сайте очень много страниц? Для этого немного «модернизируем» скрипт, заменив в нем всего лишь одну первую строчку:

$LastModified_unix = strtotime(date("D, d M Y H:i:s", filectime($_SERVER["SCRIPT_FILENAME"])));
$LastModified = gmdate("D, d M Y H:i:s \G\M\T", $LastModified_unix);
$IfModifiedSince = false;

if (isset($_ENV["HTTP_IF_MODIFIED_SINCE"]))
$IfModifiedSince = strtotime(substr ($_ENV["HTTP_IF_MODIFIED_SINCE"], 5));

if (isset($_SERVER["HTTP_IF_MODIFIED_SINCE"]))
$IfModifiedSince = strtotime(substr ($_SERVER["HTTP_IF_MODIFIED_SINCE"], 5));

if ($IfModifiedSince && $IfModifiedSince >= $LastModified_unix) {
header($_SERVER["SERVER_PROTOCOL"] . " 304 Not Modified");
exit;
}

header("Last-Modified: ". $LastModified);

В обновленном варианте первая строчка кода преобразует текстовое представление даты на английском языке в метку в формате Unix Time Stamp , таким образом используя автоматически вычисленное время изменения текущей страницы сайта.

Всё, готово! Теперь нам остается вставить получившийся код в раздел ... каждой страницы сайта и наслаждаться высокой скоростью загрузки страниц и их индексации поисковыми роботами.

Поможем с настройкой Last-Modified!

Начните с простого звонка в «Т-Дизайн»! Наш телефон — 8 499 340-17-82 — работает в режиме нон-стоп , чтобы вы могли оперативно получать интересующую вас информацию по решению задач развития и поддержки вашего сайта. Мы проконсультируем по всем вопросам и подберем оптимальный тариф для вашей компании.

Зачем настраивать заголовок Last-Modified. Давайте попробуем максимально быстро и просто разобраться с настройкой заголовка Last-Modified.

Для начала скажу, что это нужно в первую очередь для снижения нагрузки на сервер и ускорения индексации страниц. Именно поэтому необходимо произвести настройку заголовка Last-Modified, особенно для крупных ресурсов с большим количеством страниц.

Цель этого заголовка — сообщить клиенту (браузеру или поисковику) информацию о последних изменениях конкретной страницы. Клиент передает серверу заголовок If-Modified-Since. Если изменений на странице не обнаружено, то от сервера возвращается заголовок «304 Not Modified». При этом страница не загружается.

Если же изменения вносились, то это будет учтено, и сервер вернет заголовок «200 OK» (страница загрузится с обновленным содержимым).

Корректная настройка Last-Modified дает следующие преимущества:

  • в результатах поиска отображается дата последнего обновления содержимого страницы;
  • страницы при сортировке в поисковике по дате занимают более высокие позиции;
  • существенно ускоряется индексация страниц.
  • Почему же роботы быстрее индексируют сайты с настроенным Last-Modified?

    Ответ прост: если на сайте было изменено всего 20 страниц, то роботу не нужно индексировать все 500 в поисках нового контента, поскольку Last-Modified укажет страницы с изменениями.

    Last-Modified особенно важен для ресурсов с большим количеством страниц, ведь на обход каждого сайта роботу отводится ограниченное количество времени, и он может не успеть дойти до нужных страниц.

    Как настроить Last-Modified

    Для начала необходимо проверить, настроен ли у вас этот заголовок. Для этого можно использовать сервисы varvy.com , last-modified.com или tools.seo-auditor.com.ru . Если проверка показала отсутствие заголовка, то следует приступить к его настройке.

    Если у вас статический сайт, то для каждой страницы необходимо прописать код, который вы видите на экране:

    После каждого изменения содержимого вручную изменяем дату в коде. И что, каждый раз так, спросите вы меня? Да, если сайт статический.

    Если сайт динамический, то используем настройку в PHP. Часто встречается вот такой код:

    header(«Last-Modified: » . date(‘r’,strtotime($post->post_modified)))

    Его необходимо добавить в header.php. Но он будет работать только для записей и страниц и не будет срабатывать на главной. Также он недействителен для таксономий, архивов и учета новых комментариев.

    $LastModified_unix = 1294844676;

    $Last Modified = gmdate(«D, d M Y H:i:s \G\M\T», $LastModified_unix);

    $IfModifiedSince = false;

    if (isset($_ENV[‘HTTP_IF_MODIFIED_SINCE’]))

    $IfModifiedSince = strtotime(substr($_ENV[‘HTTP_IF_MODIFIED_SINCE’], 5));

    if (isset($_SERVER[‘HTTP_IF_MODIFIED_SINCE’]))

    $IfModifiedSince = strtotime(substr($_SERVER[‘HTTP_IF_MODIFIED_SINCE’], 5));

    If ($IfModifiedSince && $IfModifiedSince >= &LastModified_unix) {

    header ($_SERVER[‘SERVER_PROTOCOL’] . ‘ 304 Not Modified’);

    header(‘Last-Modified: ‘ . $LastModified);

    Также можно настроить заголовок, прописав две строки в файле.htaccess:

    RewriteRule .* —

    RewriteRule .* —

    Но в этом случае необходимо проверить, не возникнет ли проблем со стороны хостинга.

    Чтобы не прописывать коды, можно использовать готовые решения для настройки Last-Modified. Например, для CMS WordPress есть плагины Clearfy и Last Modified Timestamp. Настройку можно выполнить с помощью плагина WP Super Cache. Для этого в расширенных настройках активируйте пункт «Ошибка 304» (поддержка ответа 304 отключена по умолчанию, так как на некоторых хостингах могут возникать проблемы). Для других CMS также существуют свои плагины, ну или в крайнем случае, можно заказать плагин у программиста.

    Следует понимать, что настройка Last-Modified не всегда полезна (например, когда на каждой странице установлен «сквозной» блок информации с регулярно меняющимся контентом одинакового содержания). В этом случае поисковики могут перестать воспринимать информацию как новую и станут реже посещать ваш сайт.

    В остальных случаях, настроив Last-Modified, вы получаете:

    • экономию трафика;
    • ускоряете работу сайта;
    • выполняете рекомендации поисковиков Google и Яндекс, что значительно ускоряет индексацию и повышает видимость страниц в поиске. Особенно хорошо это заметно на ресурсах с большим количеством страниц.

    Заголовки Last-Modified и If-Modified-Since для WordPress

    Мало кто обращает внимание на HTTP заголовки Last-Modified и If-Modified-Since при оптимизации своего сайта, а зря! Важно, чтобы страница, контент которой не менялся с последнего визита поискового робота отдавала 304 код, который собственно и говорит о том, что данная конкретная страница ничем не дополнялась – Вы не редактировали и не дополняли текст, к этой записи не добавлялись комментарии и т.п.

    Если данный http-заголовок отсутствует, то в Яндексе, при сортировке результатов по дате, сайт не будет виден большинству юзеров.

    Именно поэтому важно, чтобы Вы не только его правильно настроили, но и каждый раз, когда редактируете запись, обновляли дату на текущую. Это нужно будет делать вручную.

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

    Зачем нужны заголовки Last-Modified и If-Modified-Since?

    1. Когда сервер отдаёт такой код, то выполнение всех PHP сценариев на странице даже не запускается. Страница загружается из кэша поиска, а это, как Вы понимаете, весьма существенно снижает нагрузку на сервер к вящей радости Вашего хостера и ускоряет загрузку страницы у посетителя, что тоже не может не радовать.

    Как это происходит?

    Сканируя интернет, пауки Google и Яндекса сохраняют в своей базе копию каждого сайта. Эта копия служит неким образцом для сравнения: все ли по-прежнему или произошли изменения. И если не настроены заголовки Last-Modified и If-Modified-Since или настроены неправильно, новые страницы сайта проходят индексацию, а главная в кэше поисковиков долго не обновляется, как не обновляется и лента комментариев.

    Но для часто обновляемых страниц (новостных лент, обновляемых по многу раз в сутки, активно комментируемых блогов и т.п.) у него есть один недостаток: информация в кэше слишком быстро устаревает и человек, даже перезагружая страницу, не видит свежих новостей, не видит новых комментариев. Но это еще полбеды. Беда в том, что робот этого тоже не видит, если только не включен правильный заголовок Last-Modified.

    header("Last-Modified: ".gmdate("D, d M Y H:i:s ")."GMT");

    Если Ваш сайт обновляется часто (например, Ваши записи часто комментируют) можно отключить кеширование следующим набором заголовков:

    header("Expires: ".gmdate("D, d M Y H:i:s", time() + 7200)." GMT");

    Это означает, что действительность сохранённой копии должна перепроверяться при каждом запросе.

    Как работает кэширование в браузерах?

    Если оно не запрещено вызовом функции no_cache , то в Firefox и в IE страница сохраняется в кэше, при всех последующих запросах выдается именно она.

    Чтобы обновить страницу и получить ее свежую версию, нужно нажать комбинацию клавиш Ctrl + F5 , обычная кнопка «Обновить» (F5) не срабатывает. И надо сказать, документы в кэше IE могут храниться очень-очень долго.

    В Опере страница кэш очищается по нажатию кнопки «Обновить» или клавиши F5. Сочетание CRTL+F5 в Опере - перезагрузка всех открытых вкладок, Как Вы понимаете, если Вы их много наоткрывали – в процессе ожидания у Вас может отрасти борода.

    Если запретить кэширование страницы функцией no_cache , то Опера и Firefox при обращении к такой странице используют механизм с заголовком If-Modified-Since . Таким образом, кэширование происходит, но браузер спрашивает у сервера, изменилась ли страница на самом деле, или нет – это правильная постановка вопроса.

    Следовательно, нужно подключить обработку и этого параметра. Я не буду расписывать, что и какая функция означает, просто приведу код, который корректно отдает заголовки и не вызывает конфликтов на большинстве хостингов, с которыми мне приходилось работать. Эта конструкция работает на sweb.ru, eomy.net, timeweb.ru, fastvps.ru, startlogic.com

    header("Expires: ".gmdate("D, d M Y H:i:s", time() + 7200)." GMT");
    header("Cache-Control: no-cache, must-revalidate");
    $mt = filemtime($file_name);
    $mt_str = gmdate("D, d M Y H:i:s ")."GMT";
    if (isset($_SERVER["HTTP_IF_MODIFIED_SINCE"]) &&
    strtotime($_SERVER["HTTP_IF_MODIFIED_SINCE"]) >= $mt)
    {header("HTTP/1.1 304 Not Modified");
    die;
    }
    header("Last-Modified: ".$mt_str);
    echo $text;
    header("Vary: Accept-Encoding");
    header("Accept-Encoding:gzip,deflate,sdch");
    ?>

    Таким образом, все, что Вам нужно сделать, это скопировать данный код и добавить его в файл header.php Вашей темы оформления НАД . Т.е. этот код – находится в самом верху файла ДО всего остального кода


    Внимание! Прежде чем что-то добавлять – сохраните этот файл у себя на компьютере, чтобы можно было восстановить первоначальный вариант, если Ваш не позволяет такую конфигурацию заголовков.

    Проверяем результат на сервисе проверки заголовков Last-Modified и If-Modified-Since http://last-modified.com/ru/if-modified-since.html


    • Если результат положительный – утираем пот со лба и идем пить чай.
    • Если результат отрицательный, ту же конструкцию можно добавить в файл index.php в корне Вашего WordPress (с этим я столкнулась на хостинге timeweb.ru). Точно так же, выше всего остального в нем. Только не забудьте про это, когда будете обновлять – индексный файл перезапишется в стандартном его виде.

    Вуаля! Правильно настроив заголовки Last-Modified и If-Modified-Since, мы получили кучу бонусов:

    • Увеличили скорость загрузки страниц, что важно для робота Google и приятно для людей.
    • Снизили нагрузку на сервер, чем порадовали хостера.
    • В поисковой выдаче Яндекса будет отображаться дата последнего обновления страницы, что в отдельных случаях очень актуально для людей, а потому косвенно это положительно отразится на поведенческих факторах.
    • Страницы нашего сайта будут участвовать в сортировке поисковых систем по дате – да-да, этим пользуются продвинутые пользователи.
    • И, как следствие всего вышесказанного, весьма ускорится индексирование нашего сайта поисковиками.

    Многие разработчики при создании сайтов забывают про очень полезный заголовок Last-Modified, благодаря которому можно оптимизировать загрузку web-страниц и облегчить работу поисковым роботам. Далее я постараюсь восполнить этот досадный пробел.

    Для чего нужен заголовок Last-Modified?

    Функцией заголовка как можно догадаться из названия служит информирование клиента о дате последней модификации web-документа. Исходя из спецификации rfc 2616, клиент может «спросить» у веб сервера не изменилась ли страница с определенного числа, послав серверу заголовок «If-Modified-Since». Если страница не изменилась сервер возвращает только заголовок «304 Not Modified», в противном случае – сервер возвращает заголовок «200 OK» и тело страницы. Как видно, выгода на лицо как для сервера, так и для клиента: браузер не будет грузить страницу снова и снова, а веб сервер будет отдавать меньше данных.

    Какие сайты индексируются лучше? Динамические или статичные?

    Пару лет назад среди SEO-шников водились споры по поводу того, какие сайты индексируются лучше? Динамические, написанные например на php, или статичные, без использования языков программирования. Зная о заголовке Last-Modified, можно ответить на этот вопрос. Все дело в том, что веб сервер сам обрабатывает заголовок «If-Modified-Since» если файл статичный. В случае динамической генерации страницы вся ответственность за ответ ложится на язык программирования и разработчика. А так как разработчик за частую не интересуется этим вопросом, то заголовки не отдаются вовсе.

    Как заголовок Last-Modified ускоряет поисковую индексацию?

    Все просто, как написано в помощи Яндекса , «робот не сможет получить информацию о том, обновилась ли страница сайта с момента последнего индексирования. А так как число страниц, получаемых роботом с сайта за один заход, ограничено, изменившиеся страницы будут переиндексироваться реже».

    Представьте. Есть сайт с 10 тысячами страниц. Сайт написан на php. Не отдается корректно заголок Last-Modified. Поисковой робот не может получить информацию о том, обновилась ли страница сайта с момента последнего индексирования. Что он делает? Индексирует все страницы!!! А не только те, которые изменились.
    Конечно! На многих сайтах используют Sitemap . Но Sitemap это рекомендация, помощь поисковому оптимизатору. Заменой заголовка Last-Modified он быть не может!

    Настройка и обработка заголовока Last-Modified в php

    Для того чтобы веб-сервер передавал php-backend"у заголовок If-Modified-Since необходимо ему от этом сообщить!

    Для связки nginx + php так,

    location ~ \.php$
    {

    if_modified_since off;

    Fastcgi_pass fcgi;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME /<путь > /web$fastcgi_script_name;

    fastcgi_pass_header Last-Modified;
    include fastcgi_params;
    }

    Для связки apache + php, так

    # If-Modified-Since (if php is not installed as cgi then comment lines below)
    RewriteRule .* -
    RewriteRule .* -

    * This source code was highlighted with Source Code Highlighter .


    Если php работает как модуль, то ничего настраивать не надо!

    Простой php-код обработки запроса If-Modified-Since,

    $qtime = isset($_SERVER["HTTP_IF_MODIFIED_SINCE" ])? $_SERVER["HTTP_IF_MODIFIED_SINCE" ]:"" ;

    $modified = substr(gmdate("r" , $timestamp), 0, -5)."GMT" ;

    if ($hdr == $modified)
    {
    header ("HTTP/1.1 304 Not Modified " );
    header ("Last-Modified: $modified" );
    exit();
    }
    header ("Last-Modified: $modified" );
    //render

    * This source code was highlighted with Source Code Highlighter .

    Как обрабатывать запрос If-Modified-Since в symfony?

    В symfony уже предусмотрен механизм обработки заголовка. Все что нужно разработчику, так это передать в объект sfWebResponse заголовок. В случае его указания фрейморк все сделает сам.
    $datestamp = time();
    $response->setHttpHeader("Last-Modified" , $response->getDate($datestamp));

    * This source code was highlighted with Source Code Highlighter .


    Так как на странице как правило располагается разный контент, то я написал метод, который выставляет самый поздний из переданных заголовков!
    static public function setLastModified($datestamp)
    {
    $response = sfContext::getInstance()->getResponse();
    $request = sfContext::getInstance()->getRequest();

    if (is_array($datestamp))
    {
    rsort($datestamp, SORT_NUMERIC);
    $datestamp = $datestamp;
    }

    if (!$response->hasHttpHeader("Last-Modified" ))
    {
    $response->setHttpHeader("Last-Modified" , $response->getDate($datestamp));
    }
    else
    {
    $origLastModified = strtotime($response->getHttpHeader("Last-Modified" ));
    if ($origLastModified < $datestamp)
    $response->setHttpHeader("Last-Modified" , $response->getDate($datestamp));
    }
    }

    * This source code was highlighted with Source Code Highlighter .


    Его очень удобно использовать в случае, если на странице, например, располагается 3 последних видеролика, 3 последних статьи и там еще что-нибудь. Загружая каждую модель из базы данных, мы можем вызывать метод, и в итоге в ответе получив самую позднюю дату модификации.
    Для интересующихся код обработки заголовка находится в классе sfCacheFilter.class.php.

    В заключение хочу сказать, что использование заголовка Last-Modified не всегда оправдано. Например, если на сайте 5 тысяч страниц и на каждой находится один и тот же блок с часто меняющимся контентом, использовать заголовок будет бесполезно! В этом случае можно разве что отдавать разные заголовки для клиентов и поисковых роботов. Но как по мне обман роботов ни к чему хорошему не приводит. Ну или убрать этот блок;).

    Проверить сайт на корректную обработку заголовка можно

    В этой статье мы будем настраивать важнейший заголовок ответа сервера - Last-Modified, благодаря чему нагрузка на сервер снизится на 20-30%, а индексация вашего сайта ускорится в разы. Также мы научим ваш сервер выдавать 304 ошибку, в случае, когда поисковый робот обращается к вашему сайту с заголовком If-Modified-Since.

    Зачем нужен заголовок Last-Modified

    Прежде всего хотелось бы обсудить значимость заголовка Last-Modified. Но, как показывает практика, наряду со своей чрезвычайной значимостью и необходимостью, этот заголовок почему-то повсеместно забывается и совершенно несправедливо недооценивается. Если вы почитаете рекомендации поисковых систем, в которых четко и открыто говорится и важности передачи в заголовках Last-Modified (даты последнего изменения той или иной страницы), то у вас не останется никаких сомнений, что это обязательно нужно сделать и чем быстрее, тем лучше. Особенно это касается ресурсов с большой и средней посещаемостью, с регулярно пополняемым контентом. Статичные сайты с 10 страницами могут обойтись и без этого, хотя данная функция никак отрицательно не скажется и не помешает.

    Заголовок Last-Modified содержит в себе дату и время по Гринвичу, когда страница последний раз изменялась. У каждой страницы своя дата. Практически любые из существующих CMS сейчас сохраняют дату редактирования страниц или записей, также дата обновления страницы изменяется, когда кто-либо оставил индексируемый комментарий (все зависит от ваших конкретных настроек). Только вот почему-то далеко не все современные системы администрирования предусматривают отправку той самой даты изменения страницы в виде заголовка и уж, тем более, никак не реагируют на получаемый заголовок If-Modified-Since, но об этом чуть позже.

    Дело в том, что поисковый робот может довольно часто заходить на регулярно обновляемый сайт и сканировать его страницы в порядке приоритета, иногда даже приходится выставлять параметр Crawl-delay в robots.txt, чтобы немного умерить пыл излишне активных роботов, перегружающих несчастный сервер, а иногда, наоборот, люди месяцами напряженно работают, не видя никаких результатов, лишь бы только увеличить частоту посещения сайта поисковым роботом . Если такой сайт не сообщает поисковому сканеру о том, когда какие страницы последний раз изменялись и изменялись ли они вообще со времени прошлого визита, сканер в свою очередь проходится по страницам снова и снова, так как будто они изменились, хотя это может быть и не так. А так как количество загружаемых страниц за один заход поискового бота ограничено, он может просто не добраться до ваших новых статей и уйти восвояси, израсходовав лимит на старые страницы, которые и вовсе не обновлялись. Несомненно, рано или поздно сканер все-таки доберется и до новых страниц, но это будет гораздо позже. Это нужно запомнить как аксиому, а кто не верит, читает на сайте Яндекса о last-modified .

    То же самое касается и обычных посетителей сайта, ведь если ваша старая статья находится в локальном кеше, а сервер не отправляет заголовок 304 Not Modified, то она будет грузиться снова и снова, каждый раз с нуля, тем самым нагрузка на сервер будет выше. Если же со времени последнего посещения какой-то страницы и добавления ее в кеш ничего не изменилось, нужно, чтобы ваш сервер отправлял в ответе заголовок 304 Not Modified и прекращал дальнейшую генерацию страницы. Зачем каждый раз подгружать старые страницы, если на них ничего не изменилось? Их содержание можно взять из кеша. Элементарно и эффективно!

    Ответ сервера на заголовок If-Modified-Since

    Мы плавно подошли с вами ко второму, не менее важному моменту - реакции вашего сервера на посылаемый поисковыми ботами заголовок If-Modified-Since. Делают они это для того, чтобы проверить, изменялась ли ваша страница со времени последнего посещения и собственно передают в заголовке это самое время. Ваш сервер в таком случае должен сопоставить время последнего обновления страницы, к которой обратился бот и время ее последнего посещения, которое он вам сообщает. Если с тех пор ничего нового на странице не появилось, сервер должен ответить заголовком 304 Not Modified и остановить передачу данных, выйдя из исполняющего скрипта (в случае с PHP - это функция exit ). Получив 304 ответ, поисковый робот поймет, что делать тут пока больше нечего и пойдет на следующую страницу, тем самым экономя уйму времени.

    Благодаря этому индексация вашего сайта значительно ускоряется, а также снижается ненужная нагрузка на сервер.

    Хочется добавить, что в одной из наших статей мы разбирали еще один интересный способ ускорения индексации сайта. Там речь шла именно о сайтах на движке WordPress и для этого использовались специальные пинг сервера , адреса которых мы привели и указали что с ними нужно делать.

    PHP-функция

    Итак, давайте перейдем непосредственно к делу и рассмотрим функцию, разработанную нашими специалистами и успешно оттестированную на нескольких сайтах:

    Function lastModified($gmdate) { $IfModifiedSince = false; if (isset($_ENV["HTTP_IF_MODIFIED_SINCE"]) or isset($_SERVER["HTTP_IF_MODIFIED_SINCE"])) { $IfModifiedSince = strtotime(substr(($_ENV["HTTP_IF_MODIFIED_SINCE"] ? $_ENV["HTTP_IF_MODIFIED_SINCE"] : $_SERVER["HTTP_IF_MODIFIED_SINCE"]), 5)); } if ($IfModifiedSince && $IfModifiedSince >= strtotime($gmdate)) { header($_SERVER["SERVER_PROTOCOL"]." 304 Not Modified"); exit; } header("Last-Modified: ".$gmdate); }

    Хочется подчеркнуть, что функция в качестве единственного аргумента принимает дату и время по Гринвичу - gmdate() , а не date() , просьба не путать, пожалуйста. Принимаемый функцией аргумент - это и есть дата и время последнего изменения страницы. То, где вы будете ее брать - зависит от системы администрирования, вот, например, в WordPress ее можно получить так:

    $WordpressPageLastModified = get_the_modified_date("r");

    А что, если нет никакой системы администрирования и речь идет о статичной странице сайта, в которую изменения вносятся вручную, прямо в коде. На этот случай мы тоже придумали решение, как отправлять в заголовке дату ее последнего изменения:

    $StaticPageLastModified = gmdate("D, d M Y H:i:s \G\M\T", filemtime($_SERVER["DOCUMENT_ROOT"]."/index.php"));

    В данном случае мы используем функцию filemtime() , которая возвращает время последнего редактирования файла в формате Unix time.

    Кстати, не рекомендуем придумывать эту дату из головы, даже если ваша страница оставалась статичной все это время. Данная уловка ни к чему хорошему не приведет, т.к. поисковики все равно проверят, изменилась ли страница на самом деле и могут наказать за введение их в заблуждение.

    Проверка ответа сервера

    В интернете есть несколько сервисов проверки ответа сервера, но, как оказалось, не всех из них делают это корректно и не все позволяют отследить поведение вашего сервера в ответ на передаваемый заголовок If-Modified-Since, а нам то нужно убедиться, что сервер отправляет заголовок 304 Not Modified, если страница не обновлялась с момента последнего посещения.

    Проверить ответ сервера можно и на нашем сайте, но для наиболее полной картины мы все-таки рекомендуем воспользоваться официальным сервисом Яндекса . Там вы сможете указать все необходимые заголовки, а также выбрать фиктивное время последнего посещения. Так же Яндекс позволит вам выбрать тип поискового бота, но для использования этого инструмента необходимо добавить и подтвердить права на управление сайтом в Яндекс.Вебмастере, что вообще, честно говоря, нужно всегда делать первым делом.