Как узнать last modified страницы. Ускорение индексации поисковыми системами
В этой статье мы будем настраивать важнейший заголовок ответа сервера - 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, если страница не обновлялась с момента последнего посещения.
Проверить ответ сервера можно и на нашем сайте, но для наиболее полной картины мы все-таки рекомендуем воспользоваться официальным сервисом Яндекса . Там вы сможете указать все необходимые заголовки, а также выбрать фиктивное время последнего посещения. Так же Яндекс позволит вам выбрать тип поискового бота, но для использования этого инструмента необходимо добавить и подтвердить права на управление сайтом в Яндекс.Вебмастере, что вообще, честно говоря, нужно всегда делать первым делом.
В области поисковой оптимизации сайтов (SEO) гуляет вообще очень много разных мифов. Какие-то из них имеют под собой основу, какие вообще взялись не пойми откуда. В этой заметке рассмотрим один из них — использование заголовка ответа last-Modified.
Некоторое время назад к нам попал некий документ, озаглавленный «Рекомендации Ingate для веб студий по продвигаемым сайтам». И одна из «рекомендаций» была следующей:
После редизайна или на новом разрабатываемом сайте должна быть прописана дата последней модификации страниц сайта (Last Modified)
Для добавления на сайт на PHP информации о дате последней модификации страниц необходимо в самое начало исходного кода каждой страницы вставить скрипт
header ("Last-Modified: " . date("D, d M Y H:i:s", time()) . " GMT");
?>
Именно эта дикая ахинея, эта несусветная чушь и откровенно бредовый код и сподвигли меня написать эту заметку. Здесь я постараюсь объяснить, что такое Last-Modified, зачем он нужен и как его используют браузеры и поисковые машины.
Что такое Last-Modified
Веб-сервер при передаче информации клиенту (браузеры или поисковому роботу) сообщает довольно много дополнительных данных. Их можно посмотреть в консоли браузера, например:
настройте сервер на выдачу корректных заголовков ответов (например, если страница не существует, выдавать ошибку 404, а если поступил запрос If-Modified-Since, то выдавать код 304, если страница с указанной в запросе даты не изменялась).
Также можно увидеть, что если сервер никак не реагирует на условный запрос GET, то он ничем не отличается от обычного запроса. То есть, заголовок Last-Modified с текущим временем, к тому же и неправильно сформированным (привет Интегйту!) вообще не нужен!
Так нужен ли Last-Modified или нет?
Вообще нужен. Но важно понимать, что не сам заголовок играет какую-либо роль, а весь сценарий условных запросов, который должен быть реализован сайтом до конца. Именно в этом случае мы получим высокую скорость индексации сайта.
Но зачастую реализовать это в готовой CMS бывает весьма затруднительно. Возможно для этого потребуется довольно значительные изменения кода самой CMS.
Хотя для ряда CMS это можно реализовать включением кэширования страниц. Если CMS кэширует страницы, создавая и отдавая фактически статичные файлы, то сам веб-сервер будет правильно отвечать на условные запросы. Например, в WordPress это можно реализовать с помощью плагина WP Super Cache :
Проверим его в работе. Я включил этот плагин, открыл браузер в анонимном режиме и сделал два запроса одной страницы. Хорошо видно, что второй ответ правильный — 304 Not Modified:
Вместо заключения
Таким образом, мы разобрались с заголовком Last-Modified. Во-первых, он должен передавать информацию о дате и времени реального изменения документа. Во-вторых, крайне важна реакция сервера на условный запрос с заголовком If-Modified-Since.
Ну и поменьше слушайте сеошников, которые не знают элементарных основ работы интернета.
Вот не было у меня печали, пока не установил себе сегодня плагин Seo Scan. Хороший плагин, который показывает, что может не понравиться google в вашем сайте и сервере. И мой сайт кое в чем не понравился точно - это отсутствие last-modified.
Немного теории, сам только сегодня про это узнал. Last-modified - это http заголовок, который посылает сигнал о том, были ли на такой-то странице изменения или нет, посылая ответ If-Modified-Since с кодом 304. Как то так...
Хотя без всего этого сайт будет индексироваться, как говорит Яндекс, но есть и существенные минусы при отсутствии этого заголовка:
- в результатах поиска не будет показываться дата рядом со страницами сайта;
- при сортировке по дате сайт не будет виден пользователям;
- робот не сможет получить информацию о том, обновилась ли страница сайта с момента последнего индексирования. А так как число страниц, получаемых роботом с сайта за один заход, ограничено, изменившиеся страницы будут переиндексироваться реже.
Как видите, минусов много, и в первую очередь - это не очень шустрая индексация и переиндексация сайта. То есть, вы внесли в статью ПОЛЕЗНОЕ изменение, а я их сейчас делаю много каждый день, а Яндекс и Google могут увидеть это только через пару месяцев! Нет, такой хоккей нам не нужен, теперь я разобьюсь в лепешку, а исправлю этот недочет!
Как проверить last-modified?
Проверить можно разными способами, в wordpress самое простое - это установить вышеупомянутый плагин Seo Scan , у меня он выдал такое:
В общем, кажется мне не светит настроить last-modified в этой конфигурации нормально. Может мне отказаться от ngnix в пользу apache? Сервер у меня нормальный, а посещаемость на фантастическая. Может попробовать?
Ну а чтобы просто так не сидеть, а напрячь еще и вас, читатели, решил пока опубликовать этот пост, может вы знаете,
P.S. Решил проблему просто: отключил ngnix, оставил только apache, все заработало, в производительности разницы не заметил.
СОВЕТ ВЕБМАСТЕРУ: Умение зарабатывать в интернете - это только пол дела, вторая половина - это умение ВЫГОДНО обналичивать электронные деньги. Вот список офшорных банковских карт, на которые можно выводить средства и потом снимать с них хрустящие купюры:
1. Payoneer - Самая популярная в мире платежная система для фрилансеров. Выдает карты, находится в США.
2. EpayService - Американская платежная система, очень популярна во многих странах, бесплатно дает карту MasterCard в EVRO для жителей СНГ и Европы.
3. Skrill - Единственная платежная система которая работает с криптовалютами и при этом выпускает бесплатные банковские карты MasterCard.
4. AdvCash - Офшорный банк находится в Белизе, можно открыть счет в долларах, евро, фунтах и рублях.
5. Payeer - Штаб квартира этой платежной системы находится в Грузии, тут так же можно открыть счет в долларах, евро и рублях.
Домен RU - 99 руб Домен РФ - 99 руб |
HTTP-заголовок Last-Modified сообщает клиенту время последнего изменения страницы (объекта). Если клиент (браузер, поисковый робот) получил заголовок Last-Modified, то при следующем обращении к адресу, при условии, что страница (объект) есть в локальном кеше, он добавит вопрос If-Modified-Since (не изменилась ли страница после даты, полученной в Last-Modified). В свою очередь сервер, получив запрос If-Modified-Since должен сверить полученную временную метку с временем последнего изменения страницы и, если страница не изменялась ответить 304 Not Modified.
Экономия Трафика
Если страница не изменилась, то сервер прекратит передачу данных после отправки заголовков с кодом 304 Not Modified, тело страницы, изображения и другие объекты передаваться не будут.
Снижение нагрузки на сервер
Правильная реализация проверки времени последнего изменения страницы может значительно (до 30% и более) сократить нагрузку на сервер. Под правильной реализацией подразумевается проверка времени до начала генерации страницы на динамическом сайте. В таком случае все действия для генерации страницы (запрос контента из базы данных, парсинг шаблонов, получение комментариев и др) выполняться не будут. Особенно это актуально для сайтов с высокой посещаемостью и долгой продолжительностью визита пользователя. Пример: пользователь находится на сайте спортивных новостей и постоянно обновляет главную страницу в ожидании публикации результата матча. За несколько минут страница может быть запрошена и получена десятки раз. Если заголовок Last-Modified отдается и запрос If-Modified-Since обрабатывается правильно, то реально страница будет передана один раз, а на все последующие запросы будет выдан ответ 304 Not Modified.
Ускорение индексации поисковыми системами
Поисковые системы через руководство для вебмастеров рекомендуют отсылать заголовок Last-Modified и правильно обрабатывать If-Modified-Since.
Убедитесь, что ваш веб-сервер поддерживает HTTP-заголовок If-Modified-Since. Этот заголовок позволит веб-серверу сообщать Google, изменилось ли содержание сайта со времени последнего сканирования. Поддержка данной функции сократит нагрузку на пропускную способность и издержки.
Google: Руководство для веб-мастеров
Следите за корректностью HTTP-заголовков. В частности, важно, содержание ответа, который сервер отдает на запрос If-Modified-Since. Заголовок Last-Modified должен отдавать корректную дату последнего изменения документа. Даже если сервер не выдает дату последней модификации документа (Last-Modified), ваш сайт будет проиндексирован. Однако в этом случае следует учитывать следующее:
- в результатах поиска не будет показываться дата рядом со страницами вашего сайта;
- при сортировке по дате сайт не будет виден большинству пользователей;
- робот не сможет получить информацию о том, обновилась ли страница сайта с момента последнего индексирования. А так как число страниц, получаемых роботом с сайта за один заход, ограничено, изменившиеся страницы будут переиндексироваться реже.
HTTP заголовок Last-Modified сообщает клиенту время последнего изменения страницы (объекта). Если клиент (браузер, поисковый робот) получил заголовок Last-Modified , то при следующем обращении к адресу, при условии, что страница (объект) есть в локальном кеше, он добавит вопрос If-Modified-Since (не изменилась ли страница после даты, полученной в Last-Modified). В свою очередь сервер, получив запрос If-Modified-Since должен сверить полученную временную метку с временем последнего изменения страницы и, если страница не изменялась ответить 304 Not Modified .
Экономия Трафика
Если страница не изменилась, то сервер прекратит передачу данных после отправки заголовков с кодом 304 Not Modified , тело страницы, изображения и другие объекты передаваться не будут.
Снижение нагрузки на сервер
Правильная реализация проверки времени последнего изменения страницы может значительно (до 30% и более) сократить нагрузку на сервер. Под правильной реализацией подразумевается проверка времени до начала генерации страницы на динамическом сайте. В таком случае все действия для генерации страницы (запрос контента из базы данных, парсинг шаблонов, получение комментариев и др) выполняться не будут. Особенно это актуально для сайтов с высокой посещаемостью и долгой продолжительностью визита пользователя. Пример: пользователь находится на сайте спортивных новостей и постоянно обновляет главную страницу в ожидании публикации результата матча. За несколько минут страница может быть запрошена и получена десятки раз. Если заголовок Last-Modified отдается и запрос If-Modified-Since обрабатывается правильно, то реально страница будет передана один раз, а на все последующие запросы будет выдан ответ 304 Not Modified .
Ускорение индексации поисковыми системами
Поисковые системы через руководство для вебмастеров рекомендуют отсылать заголовок Last-Modified и правильно обрабатывать If-Modified-Since .
Убедитесь, что ваш веб-сервер поддерживает HTTP-заголовок If-Modified-Since . Этот заголовок позволит веб-серверу сообщать Google, изменилось ли содержание сайта со времени последнего сканирования. Поддержка данной функции сократит нагрузку на пропускную способность и издержки.
Следите за корректностью http-заголовков. В частности, важно, содержание ответа, который сервер отдает на запрос if-modified-since . Заголовок Last-Modified должен отдавать корректную дату последнего изменения документа. Если сервер не выдает дату последней модификации документа, ваш сайт будет проиндексирован, но:
- в результатах поиска не будет показываться дата рядом со страницами вашего сайта;
- при сортировке по дате сайт не будет виден большинству пользователей;
- робот не сможет получить информацию о том, обновилась ли страница сайта с момента последнего индексирования. А так как число страниц, получаемых роботом с сайта за один заход, ограничено, изменившиеся страницы будут переиндексироваться реже.