Заголовок If-Modified-Since, если PHP не установлен как моду
Наверное, каждый веб-программист, интересующийся кешированием веб-страниц на стороне клиента, знает о таких заголовках HTTP, как «If-Modified-Since» и «If-None-Match». Данные заголовки отправляются браузером при обращении к странице, которая имеется в его кеше. Для правильной организации кеширования на стороне клиента, серверному приложению необходимо отправлять заголовок «HTTP/1.0 304 Not Modified» и прекращать передачу данных в случае, если содержимое запрашиваемой страницы не изменилось с того момента времени, которое указано в присланном заголовке «If-Modified-Since».
Основная проблема при реализации кеширования на стороне клиента заключается в том, чтобы получить содержимое заголовка «If-Modified-Since». Вызвана она тем, что по умолчанию указанный заголовок доступен из серверного приложения только в том случае, если интерпретатор PHP установлен в качестве модуля Apache, что бывает крайне редко на серверах организаций, предлагающих услуги хостинга (по соображениям безопасности и удобства перекомпиляции PHP). Следует заметить, что кеширование на стороне клиента благотворно влияет не только на нагрузку веб-сервера, но и на скорость индексации веб-сайта поисковыми машинами. В связи с этим, опытные SEO-специалисты упорно ищут и рекомендуют «правильные» хостинговые компании.
На самом деле, существует универсальное решение данной проблемы, не требующее вмешательства в глобальную конфигурацию веб-сервера и работающее даже в том случае, когда PHP не установлен в качестве модуля Apache. Для применения данного метода необходимо и достаточно, чтобы выполнялись следующие условия:
Следует заметить, что заголовки «If-Modified-Since» и «If-None-Match» не отправляются браузером, если в предыдущих запросах к данной странице он не получал в ответе веб-сервера заголовок Last-Modified. Кроме того, при использовании в веб-приложении сессий с установками по умолчанию, указанные заголовки также не будут присылаться браузером. Для того чтобы избежать такого поведения браузера, необходимо перед запуском сессии выполнять функцию session_cache_limiter, передавая в качестве аргумента параметр ‘private_no_expire’:
Правильный ответ сервера: заголовки 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():
И последнее, нам остаётся только включить кэширование, это делается с помощью следующих строк:
Где число 10800 это время (в секундах) на которое мы хотим закэшировать страницу, то есть в данном примере на 3 часа.
И как всегда для тех, кто ничего не понял выкладываю всё полностью, как это устроенно у меня на блоге:
Думаю, вы могли заметить, что вся эта история с Ласт-модифайд является аналогом тега в sitemap.xml – lastmod. Так вот lastmod носит ознакомительно-рекомендательный характер, а с ответами вашего сервера никто не поспорит. Естественно, не редкость, когда lastmod в карте сайта отличается от заголовка Ласт-Модифайд, однако с этого момента они должны быть у вас одинаковы! Мы ведь теперь с вами какую науку изучили, не для того чтобы уподобляться горе-вебмастерам, которые дальше sitemap.xml не продвинулись.
Лично я в данный момент вообще не пользуюсь тегом lastmod в своих картах сайтах, возможно, позже я пересмотрю свои действия, но пока что не вижу смысла быть настолько скурпулёзным, имея правильные заголовки Last-Modified 🙂
И напоследок, проверить корректность Last-Modified и if-modified-since вы можете с помощью этого сервиса: клик.
Спасибо за ваше внимание, особая благодарность постоянно растущему числу подписчиков, для меня это наибольший стимул писать в блог чаще. Так что кто ещё не подписался на выход новых статей, добро пожаловать!
Заголовки Last-Modified и If-Modified-Since
2021-01-29 • 6 мин читать
SEO-оптимизаторы добиваются высокой скорости индексации. Для этого они упрощают работу поисковым роботам с помощью технических инструментов. Настраивают внутреннюю перелинковку, создают корректный файл robots.txt, генерируют актуальную карту сайта.
Как устроен Last-Modified
Вопрос «Last Modified, что это?» встречается довольно часто. Хотя ответ кроется в простом переводе на русский язык. Это заголовок последнего изменения страницы. Он сообщает браузеру или поисковым роботам время, когда ее содержание меняли в последний раз. Браузер или поисковые роботы проверяют эти данные. Они отправляют на сервер, где расположена страница, название If-Modified-Since. Ответ сервера зависит от того, совпадает ли дата последних изменений в Last Modified и If-Modified-Since. Если да, то это плохой звонок для роботов Яндекса и Google. Сервер возвращает код ответа 304 и не загружает сайт. Такое бывает, если неверно настроить или не прописать заголовок Last Modified. Если сервер возвращает код ответа 200 ОК, то заголовок работает, сервер загружает данные и начинается индексация страницы.
Для браузера ответ 304 является оптимальным. Он видит, что страница не менялась после последнего захода на ресурс. И тогда браузер следует указаниям из заглавия. Вместо загрузки с сервера он подгружает страницу из кэша. На сервер падает меньше нагрузки, а пользователь потратит меньше трафика.
Как настроенный Last-Modified влияет на скорость индексации
Ваш сайт состоит из 1000 страниц. Поисковой робот Яндекса или Google потратит время на то, чтобы проиндексировать их. Чем больше ресурс, тем дольше роботы будут с ним возиться. Заголовок сокращает время работы, потому что показывает, какие страницы не обновлялись. Робот Яндекса или Google проиндексирует сначала те из них, что изменялись.
Настройка заголовков полезна для больших ресурсов. Роботы потратят меньше времени на их индексацию.
Почему это важно для SEO?
Настраивать названия важно для продвинутых пользователей. Во время поиска они пользуются фильтрами по дате, чтобы получить, к примеру, результаты выдачи за последний месяц. Если исправлять название после внесения изменений, рядом с ней в выдаче появится дата этих изменений. И сразу будет видно, свежая эта страница или уже устарела.
Почему заголовок не подходит для страниц с частыми обновлениями?
Кэш браузера показывает их без изменений. Но разделы сайта быстро устаревают, если это не статический ресурс. Блоги, СМИ, новостные ленты, интернет-магазины часто обновляются за счет комментариев и отзывов. Если загрузить из кэша новостной ленты, не увидишь последних изменений. Робот Яндекса или Google тоже их не увидит, если не прописано корректное заглавие.
Настраиваем Last-Modified
Поисковые системы Яндекса и Google предупреждают о названии If-Modified-Since. Перед тем, как настраивать Last Modified, убедитесь, что ваш сервер поддерживает его. Яндекс еще просит указывать корректную дату в заглавии. Ведь в случае ошибки ресурс все равно будет проиндексирован. Но пользователи не увидят дату обновления и не смогут найти сайт с помощью фильтра по дате.
Посмотрите, настроен ли заголовок на сайте. Откройте сервисы Last-modified или Seo-auditor, укажите URL-адрес и проверьте наличие заглавия. Если его нет, прописываем настройки вручную.
Настраиваем синтаксис Last-Modified
Для статического ресурса достаточно указать простой код с указанием даты последнего изменения:
Такой код необходимо прописан для каждой страницы. А в случае обновления — менять вручную.
Для динамических сайтов с постоянными обновлениями нужно настраивать PHP. Пример кода, который правильно передает все заголовки и не конфликтует с большинством хостингов.
Вывод
Настраивать заголовок несложно, зато он дает несколько преимуществ:
Крупные сайты без заглавий последних изменений будут долго индексироваться и долго загружаться. Пользователи могут не дождаться и закрыть вкладку, а роботы понизят позиции в поисковой выдаче. Наличие заголовков поможет получить дополнительный трафик. Пользователи оценят, что вы даете им актуальную информацию и честно сообщаете об этом в графе с датой публикации.
Заголовок Last-Modified ускоряет индексацию новых страниц в разы
HTTP заголовок Last-Modified (последние изменения) передает клиенту время последнего изменения документа (веб-страницы). Клиент (браузер или поисковый робот) отправляет серверу заголовок «If-Modified-Since» и если дата последнего изменения страницы совпадает, сервер возвращает заголовок «304 Not Modified» и не загружает страницу. Если время последнего изменения отличается (или last modified header не настроен) — сервер возвращает заголовок «200 OK» и загружает страницу. То есть вместо повторной перезагрузки страницы и обновления кеша, клиент получает всего лишь заголовок 304. Клиент экономит трафик, а сервер отдает меньше данных — обоюдная экономия.
Но, зачем была бы эта статья, если не рассказать про пользу, которую настройка заголовка Last-Modified несет для SEO оптимизации сайта, а если точнее для ускорения индексации сайта. Нетрудно догадаться, что 10 страниц сайта будут проиндексированы быстрее, чем 1000. Тот же принцип, который позволяет оптимизировать загрузку страниц работает и для индексации. Поисковой системе не нужно индексировать 1000 страниц, чтобы найти 10 новых страниц. Благодаря last modified, мы оставляем для робота только новые страницы (или обновленные). Робот приходит на сайт и берет сперва то, что нужно, а потом все остальное.
Настройка заголовка Last-Modified
Крупные поисковые системы рекомендуют вебмастерам использовать обработку заголовков для ускорения индексации или сокращения нагрузки. Вот, что по этому поводу пишут поисковики в своих руководствах.
Вот примеры того, как настроить отправку заголовка last-modified и правильную обработку If-Modified-Since.
Как настроить meta Last-Modified для статичных html страниц
Как настроить Last-Modified в php
Как настроить Last-Modified nginx + php
Проверить Last-Modified
Когда передача заголовка клиенту настроена, не повредит проверка last modified на корректность. Проверить Last-Modified на собственном или стороннем сайта можно через онлайн сервисы.
Или сделать свою проверку на корректную обработку заголовка Last-Modified:
Настройка заголовка Last-Modified и обработка заголовка If-Modified-Since будет крайне полезна любому более или менне крупному сайту. Скорость обработки страниц сайта может стать значительным фактором улучшения ранжирования сайта в поиске. Сравнительно несложная настройка не создаст проблем, тем более, что для популярных CMS вроде joomla, wordpress, modx и т.д. существуют готовые решения.
Добавить комментарий (8) Отменить ответ
Полностью солидарен с Вами, и еще один факт для WordPress ни один пример не работает.
Для WP существует масса решений, неужели не нашли?
Вы правильно подметили, и похоже конверт монстру по барабану ваши замечания,
Беспочвенные обвинения, так не приятны(
Да, это общие советы. Универсального правильного кода быть не может.
Если у вас распространенная cms, начните поиск решения с плагина (на WP, например WP Super Cache хорошо себя показал).
Ну и конечно, не рекомендуем лезть в код без специалистов.
Last Modified и WordPress
Давайте сегодня рассмотрим такой вопрос: что такое Last Modified и If-Modified-Since, зачем они нужен и как добавить их в WordPress.
Что такое Last Modified
Это один из ответов сервера при открытии любой страницы Вашего сайта. Он содержит в себе дату последнего изменения страницы в определенном Unix-формате.
Поисковые системы смотрят этот заголовок во время индексации перед тем, как скачать страницу и сравнивают с уже существующей записью у них. Если ничего не изменилось — поисковик пропускает страницу и переходит к следующей. Если есть изменения — он скачивает её заново и проверяет, что изменилось.
Что такое If-Modified-Since
Это заголовок, который посылает поисковая система, содержащий дату последней индексации страницы. Наш сайт на этот заголовок должен правильно среагировать — отдать правильный ответ. Если страница не была изменена за это время — дать ответ 304 Not Modified, который скажет поисковой системе, что страница не менялась и можно переходить к следующей. В случае, если страница была обновлена — отдать ответ 200 OK
Как же это влияет на индексацию?
Поисковик за раз может пройти только определенное количество страниц на Вашем сайте и, если он будет каждую выкачивать и проверять на изменения, лимит быстро закончится и часть страниц он просто не успеет проверить. В индекс попадет значительно меньше новых страниц, чем могло быть. Особенно это актуально тогда, когда количество страниц переходит за тысячу.
Если поисковик видит, что изменения не было — он просто пропускает страницу и сразу переходит к следующей.
Вот, что пишет у себя Яндекс по поводу Last Modified, если такой заголовок не отдается:
Вывод: отдавать заголовок Last Modified и правильный ответ на If-Modified-Since в крайней степени желательно, если Вы не хотите проблем с индексацией.
Проверить Ваш сайт можно по ссылке.
Как добавить Last Modified?
Интернет пестрит такого рода решениями:
Или ковырянием в ядре движка. Оба варианта не подходят. Объясним почему.
Первый вариант предлагается добавлять в header.php. Какие здесь минусы:
Второй вариант сразу отпадает и никогда таким не занимайтесь. Лезть в код ядра НЕЛЬЗЯ! При обновлении — все Ваши правки сотрутся.
Почему необходим If-Modified-Since?
При повторном посещении Вашего сайта поисковая система добавить к запросу заголовок If-Modified-Since и не получив ответа 304 Not Modified — она будет заново выкачивать страницу и сравнивать её. Одним Last-Modified не отделаться. Поисковик должен именно получить ответ на вопрос: «менялась ли страница с».
Как добавить If-Modified-Since
Как проверить, работает ли у меня Last Modified?
Создайте у себя на хостинге файл с содержимым:
Откройте его в браузере и проверьте заголовки.
Где найти правильное рабочее решение?
Мы полностью переработали это решение, добавили различные проверки на ошибки, переписали код через хуки, добавили вывод не только для постов, но и для главной, для категорий, тегов, таксономий и всех остальных архивов. Добавили проверку на новые комментарии, они обновляют дату изменения.
И все это мы упаковали в одну из функций нашего плагина — Clearfy. Проверьте описание плагина — это настоящий комбайн полезных улучшений Вашего блога по минимальной цене.
Результат работы плагина Clearfy:











