Заголовок Last-Modified ускоряет индексацию новых страниц в разы. Блог в котором есть много интересной информации… Поможем с настройкой Last-Modified

Вот не было у меня печали, пока не установил себе сегодня плагин Seo Scan. Хороший плагин, который показывает, что может не понравиться google в вашем сайте и сервере. И мой сайт кое в чем не понравился точно — это отсутствие last-modified.


Немного теории, сам только сегодня про это узнал. Last-modified — это http заголовок, который посылает сигнал о том, были ли на такой-то странице изменения или нет, посылая ответ If-Modified-Since с кодом 304. Как то так…

Хотя без всего этого сайт будет индексироваться, как говорит Яндекс, но есть и существенные минусы при отсутствии этого заголовка:

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

Как видите, минусов много, и в первую очередь — это не очень шустрая индексация и переиндексация сайта. То есть, вы внесли в статью ПОЛЕЗНОЕ изменение, а я их сейчас делаю много каждый день, а Яндекс и Google могут увидеть это только через пару месяцев! Нет, такой хоккей нам не нужен, теперь я разобьюсь в лепешку, а исправлю этот недочет!

Как проверить last-modified?

Проверить можно разными способами, в wordpress самое простое — это установить вышеупомянутый плагин Seo Scan , у меня он выдал такое:

Тоже барахлит, но это другая история, потом поковыряюсь и с этим. Можно так же проверить last-modified через сервис с одноименным названием last-modified.com


Как видите, и тут показывает отсутствие ответа If-Modified-Since — Last Modifed не найден! А можно использовать сервис Яндекса Проверка ответа сервера


Тут тоже самое — Код статуса HTTP: «304 Not Modified» — значит не работает система. Хотя через какое-то время явная ошибка пропала, но код ответа 304 так и не появился.

Сразу стало интересно, а у кого-то хоть это работает? Решил проверить это у тех блогеров, которые сами писали мануалы на эту тему:


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

Как настроить last-modified?

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

1. Первый способ — установка плагина

Самый простой способ для тех, у кого WordPress — это установить плагины, для этого предназначенные, например: Add Headers, If Modified Since или If Modified Since Header.

У меня ни один из этих плагинов не дал результата, не знаю почему. Может заработает у вас?

2. Второй способ — PHP код

Сервис last-modified.com , описанный выше, предлагает в файл header.php, в самое начало, поместить такой php код:

= $LastModified_unix) { header($_SERVER["SERVER_PROTOCOL"] . " 304 Not Modified"); exit; } header("Last-Modified: ". $LastModified); ?>

Мне это тоже не помогло. Предлагаю так же попробовать разместить его в файле index.php в корне сайта, но мне и это не помогло.

3. Третий способ — запись в.htaccess

Если у вас сервер на Apache, то скорее всего у вас это заработает. Нужно в файл .htaccess в корне сайта вставить код:

RewriteRule .* - RewriteRule .* -

У меня не заработало, так как у меня стоит связка Ngnix + Apache и все эти манипуляции с.htaccess чаще всего не срабатывают.
После всех этих мучений подумал: а чего это я один мучаюсь? Напишу как в службу поддержки хостинга, там люди грамотные, может подскажут? Написал, сижу жду.

Пришел ответ от техподдержки:

Всё просто. Страницы вашего сайта генерируются php-скриптами которые не выдают браузеру этот заголовок.
Веб-сервер (nginx) для статических файлов (jpg, gif, css, js и т.д.) выдаёт в заголовке 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.

Заметка: активирована адаптивная версия сайта, которая автоматически подстраивается под небольшой размер Вашего браузера и скрывает некоторые детали сайта для удобства чтения. Приятного просмотра!

Здравствуйте уважаемые читатели блога Мы продолжаем тему , одного из важнейших факторов SEO. Эта статья затронет то, что можно назвать тонкостями внутренней оптимизации, так как речь пойдёт о коде ответа, который получат поисковые системы и посетители в ответ на их обращение к странице.

Правильный ответ сервера

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

Таким образом, настроив правильные ответы нашего сервера, мы убиваем сразу как минимум пять зайцев:

  • Ускоряем загрузку страницы для посетителей (людей).
  • Снижаем нагрузку на сервер.
  • В поисковой выдаче будет (для Яндекса точно) показываться дата последнего обновления страницы, что может привлечь внимание пользователя, особенно, если дата недавняя.
  • Страницы сайта будут участвовать в сортировке поисковых систем по дате.
  • Значительно ускоряем индексирование сайта поисковыми системами!

Почему-то для меня последний пункт кажется самым сладким (так как влияет на SEO и повышает доверие к вашему сайту у поисковых систем), хотя без сомнения остальные пункты тоже чрезвычайно важны.

Как настроить 304 и 200 ответы сервера?

Мы уже сказали о том, что в ответ на запрос к неизменившимся страницам сервер должен отдавать 304 Not Modified , а какой код сервер должен отдавать, если клиент обращается к странице первый раз или обращается к изменившейся странице? В таких случаях сервер должен отдавать статус 200 OK . Специально данный код посылать не нужно, если со страницей всё в порядке, то она всегда выдаёт 200.

Поэтому нам нужно позаботиться только о 304 коде, так как его, сервер без нашего вмешательства не пошлёт. Для этого нам поможет , а также заголовок Last-Modified и запрос .

Заголовки Last-Modified

Last-Modified – это заголовок, который мы посылаем с помощью PHP, данный заголовок содержит точное время последнего изменения страницы (в секундах). Для этого используется общепринятая мера измерения времени: Unix Time Stamp.

Unix time stamp – это число секунд, прошедших с начала эпохи Юникс: 1 января 1970 года. На момент написания этого предложения Unix time stamp равняется 1370597447 секунд – это 07.06.2013 09:30:47 GMT (+00:00).

То есть все, что нам нужно делать, это всего лишь посылать PHP заголовок с инструкцией Last-Modified и нужной датой:

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

Где header – это конструкция для отправки HTTP заголовка, Last-Modified – то, что мы отправляем и сразу после двоеточия идёт его значение:

Gmdate("D, d M Y H:i:s", $last_modified_time)." GMT".

В роли значения Ласт-модифайд выступает функция gmdate() , которая содержит придуманную мной переменную $last_modified_time (вы можете назвать как угодно). В переменной $last_modified_time и содержится время последнего изменения в формате Unix Time Stamp , а функция gmdate() служит нам для того, чтобы привести дату в надлежащий вид (время по Гринвичу).

Для наглядности вот вам пример: если мы в функцию gmdate() положим значение 1365003142 , то на выходе получим: Wed, 03 Apr 2013 15:32:22 .

Теперь, когда мы узнали, как происходит весь процесс, может возникнуть вопрос: «Это что, для каждой странице нам вручную нужно указывать время последнего изменения?». Ответ: «Да!». Лично я делаю именно так – вручную, самый надёжный вариант. Однако конкретно для данного блога я всё предусмотрел, к примеру, если появляется новый комментарий на странице, то в переменную $last_modified_time заносится время добавления этого комментария, это сделано для того, чтобы поисковые системы смогли проиндексировать новые комментарии и знали, что сайт «живой». Каждый сайт индивидуален и вам придётся придумать свой собственный алгоритм по указанию даты последнего изменения страницы, или всегда указывать её вручную.

Ещё раз подчеркну, у меня алгоритм таков:

1) я указываю дату создания материала вручную, если я меняю что-то в статье (опечатки или дописываю), то затем я опять-таки вручную вписываю новое время последнего обновления.

2) Если посетитель добавляет комментарий, то в переменную $last_modified_time автоматически, без моего ведома заносится время добавления комментария, так как фактически это и будет датой последнего изменения страницы.

Чего я не учёл: в правой колонке сайта у меня находятся свежие статьи , рекомендуемые и топ-10 . Они меняются постоянно и при этом одновременно для всех страниц. Если бы я при каждом изменении правой колонки сайта менял (автоматически или вручную – не важно) дату последнего изменения страницы, то потерялся бы весь смысл этого действия. Я решил, что эти изменения отслеживать и учитывать при указании $last_modified_time не стоит, так как они не несут в себе пользы для SEO.

Как я уже писал, я не могу указать вам, как именно автоматизировать дату последнего изменения страницы, но я скажу вам, как этого делать НЕ нужно!

Ошибки при указании даты последнего изменения

Первое что может прийти в голову большинству людей, это в заголовке посылать дату последнего изменения файла с содержимым страницы. Лично у меня тексты статей лежат в файлах, а не в базе данных, так что для меня такой способ мог бы показаться отличным выходом, чтобы не вводить каждый раз Unix Time Stamp вручную. Но нет! Большинство хостингов, а может даже все, за дату последнего изменения файла берут дату его создания, они не учитывают последующие его изменения.

Я думаю, последствия в таком случаи вам понятны. Один популярный украинский хостинг провайдер (и думаю не он один) в своём FAQ пишет что-то вроде: «Вместо даты последнего изменения файла используйте функцию time() , которая возвращает текущее время в формате Unix time stamp». Вот так абсурд! Это же просто на месте застрелится! И этот хостинг-провайдер считается «одним из лучших», после того как я это прочитал, я сразу же перехотел становиться их клиентом.

Это просто анти-SEO, сами подумайте, заходит к вам на страницу поисковичёк и смотрит: «Ух ты ж-ка! Последнее время изменения страницы было только что, вот это я угадал когда прийти, класс!». Заходит он через пару дней на эту же самую страницу: «Гляди-ка, опять только что изменилась, вот это совпадение… Погодите, а почему я не вижу никаких изменений? Ладно, приду в другой раз». Приходит снова: «Ну нет мужики, это уже не смешно, доверять вам точно нельзя». Вот такая вот сказочка:)

А потом люди удивляются, почему результаты в поисковой выдачи не такие как хотелось бы, да потому что к вашему сайту теряется банальное доверие (trust). Прям как в притче "Про пастуха и волков".

Итак, с основными ошибками разобрались: нельзя указывать текущее время и не советую указывать время изменения файла. Теперь продолжим разбирать как это всё работает.

Настроить отсылку заголовков Last-Modified это ровно 1/3 дела, нам ещё предстоит: сделать ответ на запрос и включить кэширование страницы . Оба эти действия не займут много времени и строк кода.

– это запрос клиента к вашему серверу, в нём клиент спрашивает: «не изменилась ли страница с моего последнего визита?». Если страница не изменилась, то мы должны остановить выполнение дальнейшей загрузки страницы командой:

При этом тело страницы не должно начать отрисовываться, это всё происходит ДО первого вывода чего-либо на страницу! Вместе с этим необходимо вернуть клиенту ответ сервера 304 Not Modified , тем самым сказав, что страницу нужно взять из кэша. Давайте сразу к делу:

If (isset($_SERVER["HTTP_IF_MODIFIED_SINCE"]) && strtotime($_SERVER["HTTP_IF_MODIFIED_SINCE"]) >= $last_modified_time){ header("HTTP/1.1 304 Not Modified"); die; } header("Last-Modified: ".gmdate("D, d M Y H:i:s", $last_modified_time)." GMT");

Итак, в первой строке мы с помощью проверяем, пришёл ли к нашему серверу запрос HTTP_IF_MODIFIED_SINCE, а также сразу проверяем число секунд в пришедшем HTTP_IF_MODIFIED_SINCE больше, чем в $last_modified_time или нет? Если больше, значит дата последнего визита клиента позже, чем дата последнего изменения страницы, отсюда делаем чисто логический вывод, что страница не изменилась, а значит второй строчкой отправляем ответ сервера 304 Not Modified и 3 строчкой убиваем (прекращаем) выполнение всех сценариев на странице. Другими словами прекращаем её загрузку.

Если же клиент не послал нам запрос HTTP_IF_MODIFIED_SINCE или его последний визит оказался раньше, чем дата последнего изменения страницы, то мы (по умолчанию) отдаём код 200 ОК и пятой строкой посылаем ему АКТУАЛЬНУЮ дату изменения страницы, вместо той, что была у него.

Про IF_MODIFIED_SINCE и как устроен код рассказал вам всё что нужно, кроме того, что делает функция strtotime():

Strtotime($_SERVER["HTTP_IF_MODIFIED_SINCE"])

Внимательный и смекалистый читатель уже мог догадаться, что эта функция конвертирует обычную дату в Unix time stamp, так как переменную $last_modified_time мы задаём именно в нём, а потому для сравнения нам необходимо привести всё к общему знаменателю общей системе измерения.

И последнее, нам остаётся только включить кэширование, это делается с помощью следующих строк:

Header("Cache-Control: public"); header("Expires: " . date("r", time()+10800));

Где число 10800 это время (в секундах) на которое мы хотим закэшировать страницу, то есть в данном примере на 3 часа.

И как всегда для тех, кто ничего не понял выкладываю всё полностью, как это устроенно у меня на блоге:

= $last_modified_time){ header("HTTP/1.1 304 Not Modified"); die; /* убили всё, что ниже */ } header("Last-Modified: ".gmdate("D, d M Y H:i:s", $last_modified_time)." GMT"); ?> И пошла поехала вся остальная часть страницы

Думаю, вы могли заметить, что вся эта история с Ласт-модифайд является аналогом тега в – . Так вот lastmod носит ознакомительно-рекомендательный характер, а с ответами вашего сервера никто не поспорит. Естественно, не редкость, когда lastmod в карте сайта отличается от заголовка Ласт-Модифайд, однако с этого момента они должны быть у вас одинаковы! Мы ведь теперь с вами какую науку изучили, не для того чтобы уподобляться горе-вебмастерам, которые дальше sitemap.xml не продвинулись.

Лично я в данный момент вообще не пользуюсь тегом lastmod в своих картах сайтах, возможно, позже я пересмотрю свои действия, но пока что не вижу смысла быть настолько скурпулёзным, имея правильные заголовки Last-Modified :)

И напоследок, проверить корректность Last-Modified и вы можете с помощью этого сервиса: клик .

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

Почему этот пост в рубрике СЕО? Ласт модифиед, как уверяют поисковики, очень важный http-заголовок, который нужен для того, чтобы сообщать дату последней модификации документа, то есть дату последнего изменения на странице.

Соответсвенно, если этого заголовка не будет, точнее он не будет отдаваться, то сайт лишается некоторых преимуществ. В частности, вот что я вычитал на просторах сети о пользе last modified:

  1. Улучшается скорость индексации новых страниц, а также за 1 посещение робот может забрать больше страниц в индекс.
  2. Улучшается скорость переиндексации страниц, на которые вы внесли изменения. Это очень полезно, а вот без этого заголовка учета ваших правок нужно ждать дольше.

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

Как проверить last modified?

Есть несколько инструментов, мне больше всего понравился этот — http://www.tools.seo-auditor.com.ru/if-modified-since/
Тут мне просто достаточно ввести адрес главной страницы или любой статьи, а потом выбрать поискового робота — Яндекс.

Ласт Модифиед на моем сайте нашли, это отлично. Но изначально его не было, как же я его настроил?


Как настроить last modified?

Если честно, мне не помогало ничего. Может из-за того, что сервер nginx . Я ставил AddHeaders — этот плагин ставит все полезные http-заголовки и в их числе есть last modified, но мне этот плагин не помог, хотя где-то год назад он успешно активировал на моем сайте этот заголовок.

Также на этот блог я поставил премиум-плагин Clearfy о котором писал . Полезная штуковина, там еще и есть функция, которая позволила бы поставить last modified.

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

Думаю, добавление заголовка положительно скажется на моих сайтах.

Универсальное решение — вам скорее всего подойдет плагин AddHeaders, если у вас сервер apache. Если nginx, то попробуйте отключить ssi в настройках домена и опять же активировать этот плагин.

В области поисковой оптимизации сайтов (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.

Ну и поменьше слушайте сеошников, которые не знают элементарных основ работы интернета.



Понравилась статья? Поделиться с друзьями: