Яндекс рекомендует следить за корректностью http-заголовков. Цитата из документа «Рекомендации Яндекса по созданию сайтов»:
«В частности важно содержание ответа, который отдаёт сервер на запрос «if-modified-since». Заголовок Last-Modified должен отдавать корректную дату последнего изменения документа.»
Проверим как с Last-Modified обстоит дело в различных CMS.
Проверять можно с помощью If Modified Since Tool, HTTP compression and HTTP conditional GET test tool, либо вручную.
Joomla+VirtueMart
Joomla поддерживает Last-Modified, но всегда прописывает текущую дату:
что-то я не понял, откуда тут взялось «304 Not Modified»? Вообще это какой-то непонятный тест, согласно всем остальным тестам и экспериментам, на запрос «if-modified-since» Joomla возвращает StatusCode=200 (OK) ну а в Last-Modified ставит текущую дату.
интересно, почему VirtueMart не использует для обработки запроса «if-modified-since» дату модификации товара mdate, которую можно посмотреть через следующий SQL запрос:
SELECT `product_name`, FROM_UNIXTIME(mdate) mdate FROM `jos_vm_product` ORDER BY mdate DESC;
И почему Joomla не использует дату модификации статей?
SELECT `title`, `modified` FROM `jos_content` ORDER BY `modified` DESC;
WordPress
WordPress Last-Modified просто напросто не поддерживает:
однако это не мешает Яндексу его успешно индексировать.
Проверка If-Modified-Since вручную
Есть простой способ проверки if-modified-since с помощью telnet. Запускаем telnet:
# 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) означает, что страница изменена.
Также можно проверить через PHP, см How to test for “If-Modified-Since” HTTP Header support.
Проверка 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 через сервис Яндекса
Если в Яндекс Веб-мастере нажать на кнопку «Проверка ответа сервера«, то мы попадаем сюда:
тут опять же видно, что сайт slogpost.ru и соответственно WordPress без плагина WP Super Cache не добавляет заголовок Last-Modified.
Ну с CMS разобрались, а как работает сам Яндекс?
Здесь можно привести такой пример: сегодня 7.7.2011, контент в Joomla был обновлен 20.6.2011, а у Яндекс в кэше версия от 11.06.2011, хотя после этой даты робот приходил уже неоднократно. В данном случае обновления Яндекс загружает с очень существенной задержкой. Вопрос — почему?
Вот, что по этому поводу говорит Платон Щукин:
По мере обхода сайта робот также переобойдет указанную страницу, после чего с обновлением поисковых баз она обновится в выдаче. Мы работаем над тем, чтобы это происходило как можно быстрее.
Со своей стороны Вы также можете помочь роботу быстрее индексировать сайт, воспользовавшись следующими рекомендациями со страницы нашей Помощи.
Добрый день. А подскажите пожалуйста, каким образом этот полезный код можно реализовать на блоге движка wordpress?
Комментарий by Lovedancer — 31 июля 2011 @ 13:36
Добрый день.
Я поискал в интернете информацию на эту тему и нашел очень интересный вариант. WordPress действительно не поддерживает HTTP заголовок If-Modified-Since, но зато есть плагин Super Cache, который кэширует HTML в виде статических файлов и обрабатывает заголовок If-Modified-Since.
Комментарий by admin — 1 августа 2011 @ 15:57
вроде Drupal поддерживает заголовок if-modified-since, при включенном кэше, об этом можно почитать тут http://drupal.org/node/47743
Комментарий by admin — 1 августа 2011 @ 18:04
все плагины кеширования отдают Last-Modified
Комментарий by darmoid — 18 января 2012 @ 5:57
У меня стоит плагин кеширования MaxCache. Проверил инструментами, но выдает, что заголовок if-modified-since не поддерживается.
Комментарий by Александр Пузатых — 22 августа 2014 @ 22:27
Так как же все же сделать отдачу этого заголовка в wordpress ? Можно ли это сделать на сервере если у меня VPS ?
Комментарий by zmoe — 5 ноября 2015 @ 15:20