Вот не было у меня печали, пока не установил себе сегодня плагин 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 = 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); ?>
Мне это тоже не помогло. Предлагаю так же попробовать разместить его в файле index.php в корне сайта, но мне и это не помогло.
3. Третий способ — запись в.htaccess
Если у вас сервер на Apache, то скорее всего у вас это заработает. Нужно в файл .htaccess в корне сайта вставить код:
RewriteRule .* - RewriteRule .* -
У меня не заработало, так как у меня стоит связка Ngnix + Apache и все эти манипуляции с.htaccess чаще всего не срабатывают.
После всех этих мучений подумал: а чего это я один мучаюсь? Напишу как в службу поддержки хостинга, там люди грамотные, может подскажут? Написал, сижу жду.
Пришел ответ от техподдержки:
Всё просто. Страницы вашего сайта генерируются php-скриптами которые не выдают браузеру этот заголовок.
Веб-сервер (nginx) для статических файлов (jpg, gif, css, js и т.д.) выдаёт в заголовке last-modified дату последнего изменения файла. Примеры на скриншотах.
Если у вас нет очень большой посещаемости сайта то кэшировать страницы сайта на стороне браузера нет смысла.
«В частности важно содержание ответа, который отдаёт сервер на запрос «if-modified-since». Заголовок Last-Modified должен отдавать корректную дату последнего изменения документа.»
Проверим как с Last-Modified обстоит дело в различных CMS.
# telnet www.example.com 80и вводим следующее:
GET /index.html HTTP/1.0 User-Agent: Mozilla/5.0 From: something.somewhere.net Accept: text/html,text/plain,application/* Host: www.example.com If-Modified-Since: Wed, 19 Oct 2005 10:50:00 GMT
если сервер вернет 304 (Not modified), значит он If-Modified-Since поддерживает, но страница не была изменена. Код 200 (Ok) означает, что страница изменена.
Проверка If-Modified-Since на С#
Проверить как работает If-Modified-Since можно с помощью следующего C# кода:
Private HttpWebResponse GetPage() { string url = @"http://....."; // Place the web request to the server by specifying the URL HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); // No need for a persistant connection request.KeepAlive = false; // The link that referred us to the URL request.Referer = url; // The user agent of the browser request.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50215)"; //Instead of HTTP 1.1 I will use HTTP 1.0. When a request tells the server it uses 1.0, //the server won"t respond with chunked data but will send the response all at once. request.ProtocolVersion = new Version(1, 1); request.IfModifiedSince = DateTime.Now.AddDays(-5); // Get the response from the server return (HttpWebResponse)request.GetResponse(); } private void TestLastModified(VirtueMartContext db, jos_vm_product product) { using (HttpWebResponse response = GetPage()) { Debug.Print("Status Code: {0}, Description: {1}\n", response.StatusCode, response.StatusDescription); string text = WebResponceReader.GetResponceText(response); Debug.Print(text.Substring(0, 100)); } }
с помощью этого метода можно убедиться в том, что Joomla всегда возвращает StatusCode=200 (OK), независимо от значения request.IfModifiedSince.
Проверка If-Modified-Since через сервис Яндекса
Если в Яндекс Веб-мастере нажать на кнопку «Проверка ответа сервера «, то мы попадаем сюда:
тут опять же видно, что сайт сайт и соответственно WordPress без плагина WP Super Cache не добавляет заголовок Last-Modified.
Ну с CMS разобрались, а как работает сам Яндекс?
Здесь можно привести такой пример: сегодня 7.7.2011, контент в Joomla был обновлен 20.6.2011, а у Яндекс в кэше версия от 11.06.2011, хотя после этой даты робот приходил уже неоднократно. В данном случае обновления Яндекс загружает с очень существенной задержкой. Вопрос — почему?
Вот, что по этому поводу говорит Платон Щукин:
По мере обхода сайта робот также переобойдет указанную страницу, после чего с обновлением поисковых баз она обновится в выдаче. Мы работаем над тем, чтобы это происходило как можно быстрее.
Со своей стороны Вы также можете помочь роботу быстрее индексировать сайт, воспользовавшись следующими рекомендациями со
Заголовки 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 и приятно для людей.
- Снизили нагрузку на сервер, чем порадовали хостера.
- В поисковой выдаче Яндекса будет отображаться дата последнего обновления страницы, что в отдельных случаях очень актуально для людей, а потому косвенно это положительно отразится на поведенческих факторах.
- Страницы нашего сайта будут участвовать в сортировке поисковых систем по дате – да-да, этим пользуются продвинутые пользователи.
- И, как следствие всего вышесказанного, весьма ускорится индексирование нашего сайта поисковиками.
HTTP заголовок Last-Modified (последние изменения) передает клиенту время последнего изменения документа (веб-страницы). Клиент (браузер или поисковый робот) отправляет серверу заголовок «If-Modified-Since » и если дата последнего изменения страницы совпадает, сервер возвращает заголовок «304 Not Modified » и не загружает страницу. Если время последнего изменения отличается (или last modified header не настроен) — сервер возвращает заголовок «200 OK » и загружает страницу. То есть вместо повторной перезагрузки страницы и обновления кеша, клиент получает всего лишь заголовок 304 . Клиент экономит трафик, а сервер отдает меньше данных — обоюдная экономия.
Но, зачем была бы эта статья, если не рассказать про пользу, которую настройка заголовка Last-Modified несет для , а если точнее для ускорения индексации сайта. Нетрудно догадаться, что 10 страниц сайта будут проиндексированы быстрее, чем 1000. Тот же принцип, который позволяет оптимизировать загрузку страниц работает и для индексации. Поисковой системе не нужно индексировать 1000 страниц, чтобы найти 10 новых страниц. Благодаря last modified, мы оставляем для робота только новые страницы (или обновленные). Робот приходит на сайт и берет сперва то, что нужно, а потом все остальное.
Настройка заголовка Last-Modified
Следите за корректностью http-заголовков. В частности, важно, содержание ответа, который сервер отдает на запрос «if-modified-since». Заголовок Last-Modified должен отдавать корректную дату последнего изменения документа. Даже если сервер не выдает дату последней модификации документа (last-modified), ваш сайт будет проиндексирован. Однако в этом случае следует учитывать следующее: - в результатах поиска не будет показываться дата рядом со страницами вашего сайта; - при сортировке по дате сайт не будет виден большинству пользователей; - робот не сможет получить информацию о том, обновилась ли страница сайта с момента последнего индексирования. А так как число страниц, получаемых роботом с сайта за один заход, ограничено, изменившиеся страницы будут переиндексироваться реже. Убедитесь, что ваш веб-сервер поддерживает HTTP-заголовок "If-Modified-Since". Этот заголовок позволит веб-серверу сообщать Google, изменился ли контент сайта со времени последнего сканирования. Поддержка этой функции сокращает издержки и нагрузку на полосу пропускания.
Вот примеры того, как настроить отправку заголовка last-modified и правильную обработку If-Modified-Since.
Как настроить meta Last-Modified для статичных html страниц
Как настроить Last-Modified в php
= $LastModified_unix) { header($_SERVER["SERVER_PROTOCOL"] . " 304 Not Modified"); exit; } header("Last-Modified: ". $LastModified); ?>Как настроить Last-Modified .htaccess
RewriteRule .* - RewriteRule .* -Как настроить Last-Modified 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; }Проверить Last-Modified
Когда передача заголовка клиенту настроена, не повредит проверка last modified на корректность. Проверить Last-Modified на собственном или стороннем сайта можно через онлайн сервисы .
Или сделать свою проверку на корректную обработку заголовка Last-Modified:
Настройка заголовка Last-Modified и обработка заголовка If-Modified-Since будет крайне полезна любому более или менне крупному сайту. Скорость обработки страниц сайта может стать значительным . Сравнительно несложная настройка не создаст проблем, тем более, что для популярных CMS вроде joomla, wordpress, modx и т.д. существуют готовые решения.
Syntax
Last-Modified:Directives
Greenwich Mean Time. HTTP dates are always expressed in GMT, never in local time.
Examples
Last-Modified: Wed, 21 Oct 2015 07:28:00 GMTSpecifications
Specification | Title |
---|---|
RFC 7232, section 2.2: Last-Modified | Hypertext Transfer Protocol (HTTP/1.1): Conditional Requests |
Browser compatibility
The compatibility table in this page is generated from structured data. If you"d like to contribute to the data, please check out https://github.com/mdn/browser-compat-data and send us a pull request.
Update compatibility data on GitHub
Desktop | Mobile | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
Chrome | Edge | Firefox | Internet Explorer | Opera | Safari | Android webview | Chrome for Android | Firefox for Android | Opera for Android | Safari on iOS | Samsung Internet | |
Last-Modified | Chrome Full support Yes | Edge Full support 12 | Firefox Full support Yes | IE Full support Yes | Opera Full support Yes | Safari Full support Yes | WebView Android Full support Yes | Chrome Android Full support Yes | Firefox Android Full support Yes | Opera Android Full support Yes | Safari iOS Full support Yes | Samsung Internet Android Full support Yes |