- Правильный ответ сервера: заголовки Last-Modified и if-modified-since
- Правильный ответ сервера
- Как настроить 304 и 200 ответы сервера?
- Заголовки Last-Modified и if-modified-since
- Ошибки при указании даты последнего изменения
- if-modified-since
- Last-Modified в WordPress
- Что такое Last-Modified
- Как добавить и настроить Last-Modified в WordPress
- Установка кеширующего плагина
- Правим headers.php
- Установка плагина Last-Modified
- Как правильно настроить ответ сервера Last-Modified?
- Что такое Last-Modified и зачем он нужен?
- Для чего нужна правильная настройка Last-Modified?
- Как проверить, корректно ли настроен Last-Modified?
- Настраиваем Last-Modified
- Поможем с настройкой Last-Modified!
- Все услуги
- Битрикс24
- 1С-Битрикс: Управление сайтом
Правильный ответ сервера: заголовки Last-Modified и if-modified-since
Здравствуйте уважаемые читатели блога Site on! Мы продолжаем тему внутренней оптимизации сайта, одного из важнейших факторов SEO. Эта статья затронет то, что можно назвать тонкостями внутренней оптимизации, так как речь пойдёт о коде ответа, который получат поисковые системы и посетители в ответ на их обращение к странице.
Правильный ответ сервера
Несмотря на то, что это довольно мелкая деталь при построении и оптимизации сайта в целом, однако она очень важна! А именно важно, чтобы страница, на которой не было изменений с последнего визита робота или человека отдавала 304 код, который означает, что страница осталась без изменений. Когда сервер отдаёт клиенту этот код, то выполнение всех PHP сценариев на странице даже не начинается, вместо этого страница загружается из кэша, что значительно снижает нагрузку на сервер и ускоряет загрузку страницы у пользователя.
Таким образом, настроив правильные ответы нашего сервера, мы убиваем сразу как минимум пять зайцев:
- Ускоряем загрузку страницы для посетителей (людей).
- Снижаем нагрузку на сервер.
- В поисковой выдаче будет (для Яндекса точно) показываться дата последнего обновления страницы, что может привлечь внимание пользователя, особенно, если дата недавняя.
- Страницы сайта будут участвовать в сортировке поисковых систем по дате.
- Значительно ускоряем индексирование сайта поисковыми системами!
Почему-то для меня последний пункт кажется самым сладким (так как влияет на SEO и повышает доверие к вашему сайту у поисковых систем), хотя без сомнения остальные пункты тоже чрезвычайно важны.
Как настроить 304 и 200 ответы сервера?
Мы уже сказали о том, что в ответ на запрос к неизменившимся страницам сервер должен отдавать 304 Not Modified, а какой код сервер должен отдавать, если клиент обращается к странице первый раз или обращается к изменившейся странице? В таких случаях сервер должен отдавать статус 200 OK. Специально данный код посылать не нужно, если со страницей всё в порядке, то она всегда выдаёт 200.
Поэтому нам нужно позаботиться только о 304 коде, так как его, сервер без нашего вмешательства не пошлёт. Для этого нам поможет веб-ориентированный язык PHP, а также заголовок Last-Modified и запрос if-modified-since.
Заголовки Last-Modified и if-modified-since
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 – это конструкция для отправки HTTP заголовка, Last-Modified – то, что мы отправляем и сразу после двоеточия идёт его значение:
В роли значения Ласт-модифайд выступает функция 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 дела, нам ещё предстоит: сделать ответ на запрос if-modified-since и включить кэширование страницы. Оба эти действия не займут много времени и строк кода.
if-modified-since
if-modified-since – это запрос клиента к вашему серверу, в нём клиент спрашивает: «не изменилась ли страница с моего последнего визита?». Если страница не изменилась, то мы должны остановить выполнение дальнейшей загрузки страницы командой:
При этом тело страницы не должно начать отрисовываться, это всё происходит ДО первого вывода чего-либо на страницу! Вместе с этим необходимо вернуть клиенту ответ сервера 304 Not Modified, тем самым сказав, что страницу нужно взять из кэша. Давайте сразу к делу:
Итак, в первой строке мы с помощью условного оператора PHP (if) проверяем, пришёл ли к нашему серверу запрос HTTP_IF_MODIFIED_SINCE, а также сразу проверяем число секунд в пришедшем HTTP_IF_MODIFIED_SINCE больше, чем в $last_modified_time или нет? Если больше, значит дата последнего визита клиента позже, чем дата последнего изменения страницы, отсюда делаем чисто логический вывод, что страница не изменилась, а значит второй строчкой отправляем ответ сервера 304 Not Modified и 3 строчкой убиваем (прекращаем) выполнение всех сценариев на странице. Другими словами прекращаем её загрузку.
Если же клиент не послал нам запрос HTTP_IF_MODIFIED_SINCE или его последний визит оказался раньше, чем дата последнего изменения страницы, то мы (по умолчанию) отдаём код 200 ОК и пятой строкой посылаем ему АКТУАЛЬНУЮ дату изменения страницы, вместо той, что была у него.
Про IF_MODIFIED_SINCE и как устроен код рассказал вам всё что нужно, кроме того, что делает функция strtotime():
Внимательный и смекалистый читатель уже мог догадаться, что эта функция конвертирует обычную дату в Unix time stamp, так как переменную $last_modified_time мы задаём именно в нём, а потому для сравнения нам необходимо привести всё к общему знаменателю общей системе измерения.
И последнее, нам остаётся только включить кэширование, это делается с помощью следующих строк:
Где число 10800 это время (в секундах) на которое мы хотим закэшировать страницу, то есть в данном примере на 3 часа.
И как всегда для тех, кто ничего не понял выкладываю всё полностью, как это устроенно у меня на блоге:
Думаю, вы могли заметить, что вся эта история с Ласт-модифайд является аналогом тега в sitemap.xml – lastmod. Так вот lastmod носит ознакомительно-рекомендательный характер, а с ответами вашего сервера никто не поспорит. Естественно, не редкость, когда lastmod в карте сайта отличается от заголовка Ласт-Модифайд, однако с этого момента они должны быть у вас одинаковы! Мы ведь теперь с вами какую науку изучили, не для того чтобы уподобляться горе-вебмастерам, которые дальше sitemap.xml не продвинулись.
Лично я в данный момент вообще не пользуюсь тегом lastmod в своих картах сайтах, возможно, позже я пересмотрю свои действия, но пока что не вижу смысла быть настолько скурпулёзным, имея правильные заголовки Last-Modified 🙂
И напоследок, проверить корректность Last-Modified и if-modified-since вы можете с помощью этого сервиса: клик.
Спасибо за ваше внимание, особая благодарность постоянно растущему числу подписчиков, для меня это наибольший стимул писать в блог чаще. Так что кто ещё не подписался на выход новых статей, добро пожаловать!
Last-Modified в WordPress
Что такое Last-Modified
Last-Modified — это часть из ответных HTTP-заголовков, посылаемых сервером в ответ на запрос браузера.
Совсем не секрет, что присутствие этого заголовка в ответе сервера положительно сказывается на работе с сайтом: отсутствие лишнего трафика (ответы сервера кешируются браузером, и если при очередном запросе ответ не изменился, то трафик не передаётся), да и просто экономия ресурсов и повышение скорости работы с сайтом.
Ещё, например, для поисковых систем невозможно понять, изменилось ли содержание страницы, если она не отдаёт Last-Modified, и потому приходится выкачивать страницу заново и сверять с предыдущей версией. Согласитесь, что это неэкономно.
Подробнее про кеширование тут, а пока вернёмся к Last-Modified в WordPress.
Как добавить и настроить Last-Modified в WordPress
Чтобы добавить Last-Modified в Вордпресс, существует несколько вариантов. Рассмотрим их ближе.
Установка кеширующего плагина
Я рекомендую попробовать настроить WP Super Cache. После прохождения по вышеуказанной инструкции, заголовки Last-Modified будут прописываться самим сервером.
При настройке NGINX обязательно отключите ssi
Учтите, заголовок Last-Modified, в данном случае, будет показывать не дату последнего изменения записи, а дату создания кешированной копии страницы, которая, в свою очередь, зависит от того, как вы настроили обновление кеша. Что, в принципе, является вполне нормальным: поисковые системы, для определения даты последнего изменения документа, смотрят, в первую очередь, в разметку, а браузеру подойдёт и дата обновления кеша.
Правим headers.php
У вас в директории с темой WordPress ( /wp-content/themes/имятемы/ ), скорее всего, есть отдельный файл шаблона header.php .
Открываем его и в самой первой строке перед всем кодом записываем
Учтите, этот вариант, возможно, не будет работать так, как вы ожидаете, при наличии установленного и настроенного кеширующего плагина.
Проверить отдаваемые заголовки можно с помощью плагина к Firefox Live HTTP Headers или одного из многочисленных онлайн-сервисов (например, этого).
Итак, проверяем заголовки. Если всё сработало, вы должны увидеть в ответе что-то навроде:
Если файла шаблона header.php нет, то попробуйте следующий вариант.
Установка плагина Last-Modified
Как и в предыдущем пункте, этот вариант будет работать только при отсутствии кеширующего плагина на сайте, например, WP Super Cache. Однако, я настоятельно рекомендую использовать последний, так как страничный кеш никогда не помешает любому хорошему проекту.
Как правильно настроить ответ сервера Last-Modified?
Один из этапов оптимизации интернет-сайта для его правильной работы и успешного продвижения — оптимизация на стороне сервера. Среди прочих моментов — настройка правильного ответа сервера на запрос «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» и «304 Not Modified». Пример такой проверки:
При отрицательном результате крайне рекомендуем приступить к настройке .
Настраиваем Last-Modified
Рассмотрим реализацию ответа HTTP-заголовка Last-Modified на PHP.
В интернете очень часто встречаются такие рекомендации по настройке Last-Modified:
Так и хочется воскликнуть: «Такой хоккей нам не нужен!» И давайте разберемся почему. В ответ на запрос пользователя функция gmdate вернет нам текущую дату по Гринвичу (GMT). И так будет происходить каждый раз при каждом запросе пользователя или поискового робота — сервер будет возвращать нам именно свою текущую дату. Получается, что при каждом посещении вашего сайта поисковиками, они будут видеть, что запрашиваемая страница только что обновлена. Это может быть «полезным» лишь несколько раз. Через некоторое время поисковик поймет, что его «дурят» и утратит какое-либо доверие к вашему сайту. Соответственно, такая реализация нам не подходит.
Обратимся за помощью к вышеупомянутому ресурсу last-modified.com. На нем также представлен вариант реализации HTTP-заголовка Last-Modified на PHP. Выглядит он следующим образом:
= $LastModified_unix) <
header($_SERVER[‘SERVER_PROTOCOL’] . ‘ 304 Not Modified’);
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) <
header($_SERVER[‘SERVER_PROTOCOL’] . ‘ 304 Not Modified’);
exit;
>
В обновленном варианте первая строчка кода преобразует текстовое представление даты на английском языке в метку в формате Unix Time Stamp, таким образом используя автоматически вычисленное время изменения текущей страницы сайта.
Всё, готово! Теперь нам остается вставить получившийся код в раздел . каждой страницы сайта и наслаждаться высокой скоростью загрузки страниц и их индексации поисковыми роботами.
Поможем с настройкой Last-Modified!
Начните с простого звонка Наш телефон — — работает в режиме нон-стоп, чтобы вы могли оперативно получать интересующую вас информацию по решению задач развития и поддержки вашего сайта. Или пишите на электронную почту info@t-design.ru. Мы проконсультируем по всем вопросам и подберем оптимальный тариф для вашей компании.
Все услуги
Битрикс24
Набор из пяти важных и полезных инструментов, которые помогают бизнесу работать: удобная и понятная система управления компанией и бизнес-процессами.
1С-Битрикс: Управление сайтом
Профессиональная система для создания, поддержки и успешного развития веб-проектов.