If-Modified-Since и кеширование. Блог в котором есть много интересной информации…

Every day Yandex indexes millions of pages and adds them to the search database. To avoid filling it with documents that will never show up in the search results, Yandex analyzes each document using a special algorithm.

If the algorithm determines that the page is unlikely to become one of the most relevant answers for any search, the page isn"t included in the current search database.

Thus, not all the indexed documents can be seen in the Yandex search results. The removal of the page from the search database doesn"t affect the page or the site traffic, because this page wouldn"t appear in the search anyway.

In addition, Yandex continues reindexing and analyzing these documents in the same way as others. If at some point the algorithm reveals that the page can get into the search results, it will be added to the search engine database.

What is a page duplicate?

Page duplicates are site pages that have identical content but different URLs.

  • http://example.com and http://example.com/index.php/ ,
  • http://example.com/page/ and http://example.com/page .

If both pages are indexed by the Yandex robot, the indexing system groups them as duplicates. Only one of the pages is listed in the search results.

There are many reasons why duplicate pages may come up:

  • Natural reasons (for example, if a page with a product description is available in several categories of an online store).
  • Issues related to incorrect site structure.

To have the right page in the search results, we recommend that you indicate it for the Yandex robot. Here"s how you can do it:

  • Set up a 301 redirect from one duplicate page to another. In this case the search will register the target of the redirect.
  • Specify the preferred (canonical) URL for the page to be included in the search.

My site has moved (the URL changed). What should we do?

If the old and new site pages are exactly the same, the server should respond with a 301 error (“Moved Permanently” ) when the old page is requested . The Location field should contain the new site"s URL. If the old site has been shut down, you can speed up its removal from the index by filling in this form: Remove URL .

You overloaded my server. Please stop.

You are trying to download confidential information from our server. What should we do?

The robot takes links from other pages. This means that that some other page contains links to confidential sections of your site. You can either protect them with a password or disallow indexing by the Yandex robot in the robots.txt file. In both cases, the robot won"t download confidential information.

How do I protect myself from the fake robots that pretend to be the Yandex robots?

Your robot tries to download my site pages using broken links. Why?

The robot takes links from other pages, which means that one of them contains broken links to your site. Perhaps you changed the site structure and the links on other sites became broken.

What does the robot do if there"s a redirect on the page? What if I use the refresh directive?

When the Yandex robot receives a respond with the 3xx code heading (which means the URL is a redirect), it adds the redirect"s target URL to its crawling list. If it is a constant redirect (301 code or the page contains a refresh directive), the old URL is excluded from the crawling list.

My page is regularly missing from the search results. What"s the problem?

If the robot gets an error when contacting a page (for example, due to unstable hosting), it removes the page from the search until the next successful contact.

Can I manage reindexing frequency with the Revisit-After directive?

No. The Yandex robot ignores it.

Which data transfer protocols are supported for indexing?

Right now, Yandex supports two protocols: HTTP and HTTPS.

How do I tell the robot that it should index pages with or without a forward slash ("/") at the end of the URL?

For the Yandex robot, pages with a “/” at the end of the URL are different from those without it. If the pages are identical, set up a 301 redirect from one page to the other (you can set it in the htaccess file) or indicate the

«В частности важно содержание ответа, который отдаёт сервер на запрос «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, хотя после этой даты робот приходил уже неоднократно. В данном случае обновления Яндекс загружает с очень существенной задержкой. Вопрос — почему?

Вот, что по этому поводу говорит Платон Щукин:

По мере обхода сайта робот также переобойдет указанную страницу, после чего с обновлением поисковых баз она обновится в выдаче. Мы работаем над тем, чтобы это происходило как можно быстрее.

Со своей стороны Вы также можете помочь роботу быстрее индексировать сайт, воспользовавшись следующими рекомендациями со

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

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

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

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

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

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

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


В общем, кажется мне не светит настроить last-modified в этой конфигурации нормально. Может мне отказаться от ngnix в пользу apache? Сервер у меня нормальный, а посещаемость на фантастическая. Может попробовать?
Ну а чтобы просто так не сидеть, а напрячь еще и вас, читатели, решил пока опубликовать этот пост, может вы знаете,

P.S. Решил проблему просто: отключил ngnix, оставил только apache, все заработало, в производительности разницы не заметил.

СОВЕТ ВЕБМАСТЕРУ: Умение зарабатывать в интернете - это только пол дела, вторая половина - это умение ВЫГОДНО обналичивать электронные деньги. Вот список офшорных банковских карт, на которые можно выводить средства и потом снимать с них хрустящие купюры:

1. Payoneer - Самая популярная в мире платежная система для фрилансеров. Выдает карты, находится в США.

2. EpayService - Американская платежная система, очень популярна во многих странах, бесплатно дает карту MasterCard в EVRO для жителей СНГ и Европы.

3. Skrill - Единственная платежная система которая работает с криптовалютами и при этом выпускает бесплатные банковские карты MasterCard.

4. AdvCash - Офшорный банк находится в Белизе, можно открыть счет в долларах, евро, фунтах и рублях.

5. Payeer - Штаб квартира этой платежной системы находится в Грузии, тут так же можно открыть счет в долларах, евро и рублях.


Домен RU - 99 руб
Домен РФ - 99 руб

Смысл if modified since заключается в том, что поисковик (в интернетах пишут что и браузеры сегодня такое умеют, не проверял) заходя на страницу считывают заголовок last modified (время последнего изменения документа) . При следующем обращении поисковик посылает запомненную дату, задача сайта проверить не обновилась ли страница с предыдущего раза и в случае совпадения дат ответить заголовком 304 Not Modified и остановить выполнения скрипта. Данные заголовки увеличат скорость переиндексации сайта.

Как добавить заголовок if modified since

Если у вашего сайта ещё нет заголовка if modified since , внесите правку в файл:
/inc/_func.php найдите (~220+ строка)

} if(!getvars()){ ... } Добавьте ниже чтоб получилось так: } if(!getvars()){ ... }else{ $a=array(); if(isset($a[$g->item(0).$g->item(1).$g->item(2)])) $t=time();//TIME;//в более поздних else{ $t=filemtime($g->file); if(isset($_SERVER["HTTP_IF_MODIFIED_SINCE"]) && strtotime($_SERVER["HTTP_IF_MODIFIED_SINCE"])>=$t){ header("HTTP/1.1 304 Not Modified"); die(); } } header("Last-Modified: ".gmdate("D, d M Y H:i:s \G\M\T",$t)); }

Если на сайте есть динамические разделы: отзывы, каталог товаров итп. добавьте их названия в массив $a, взять можно из адресной строки браузера или в разделе панели управления править меню --> ссылка.

$a=array("reviews"=>1); $a=array("reviews"=>1,"catalog"=>1);

Как проверить 304 not modified и if modified since

1) Проверить заголовки 304 not modified и if modified since можно при помощи сервиса проверка ответа сервера в яндекс вебмастере https://webmaster.yandex.ru/server-response.xml . Поставьте галочку "добавить заголовок If-Modified-Since" и поставьте там дату час тому назад должен выдать Код статуса https: "304 Not Modified". Далее установите дату на сутки назад - получим статус Код статуса https: "200 OK". Ура всё работает.
Само собой страница тестирования должна быть изменена перед проверкой.


2) Способ попроще https://last-modified.com/ru/if-modified-since.html . Вставляем адрес и вуаля, там всё по русски напишет чего найдено чего не найдено.

304 not modified не найден

Заголовок http if modified since будет найден в любом случае, а вот статус второго может оказаться таким: 304 not modified не найден , по 2-му способу проверки, по 1-му в яндексе он просто 200-й покажет.
Скорее всего проблема в том что через проксирующий сервер nginx 304 last modified не передаются заголовки или Apache не передаёт.

Я не наблюдаю такой проблемы сейчас, с Apache 2.2.27, но на всякий случай для связки Apache + php решается это двумя способами, если php установлен не как cgi:

Htaccess в самом низу приводим к виду: 1) Только в php RewriteRule (.*) index.php?q=$1 2) На все фалы RewriteRule (.*) index.php?q=$1 RewriteRule .* - #RewriteRule .* -

304 not modified nginx

Здесь немного сложнее, чтобы передавался заголовок back-end-у необходимо ему от этом сообщить. Если nginx работает как проксирующий сервер я бы сперва попробовал переключить на HTTP 1.1 - proxy_http_version 1.1; Nginx с Apache по умолчанию взаимодействуют по 1.0. Но к примеру на одном из моих серверов я так и не смог этого добиться за разумное время, в качестве проксирующего для отдачи статики стоял модуль к сипанели Nginx Admin (v4.8 Stable). Решил просто удалением модуля с front-end-ом.

Location / { chunked_transfer_encoding off; proxy_http_version 1.1; proxy_pass https://localhost:9001; proxy_buffering off; proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $host:9001; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Upgrade websocket; #? }

Если же речь идёт об отдельном сервере под сайт, то конфигурации могут быть разными:

Location ~ \.php$ { if_modified_since off; #На сайте nginx кто-то там писал что # для скриптов это и так отключено, данный флаг отключает внутреннюю проверку, пробуйте.. fastcgi_pass fcgi; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /путь/web$fastcgi_script_name; fastcgi_pass_header Last-Modified; include fastcgi_params; }

В данный момент мне негде поэкспериментировать, так что отправляю дальше в гугл ищите:

Proxy_set_header If-Modified-Since $http_if_modified_since; proxy_pass_header If-Modified-Since; fastcgi_param If-Modified-Since; underscores_in_headers on; ignore_invalid_headers off;

Если у кого есть работающие конфигурации пишите на почту выложу.

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.

Убедитесь, что ваш веб-сервер поддерживает HTTP-заголовок If-Modified-Since. Этот заголовок позволит веб-серверу сообщать Google, изменилось ли содержание сайта со времени последнего сканирования. Поддержка данной функции сократит нагрузку на пропускную способность и издержки.

Google: Руководство для веб-мастеров

Следите за корректностью HTTP-заголовков. В частности, важно, содержание ответа, который сервер отдает на запрос If-Modified-Since. Заголовок Last-Modified должен отдавать корректную дату последнего изменения документа. Даже если сервер не выдает дату последней модификации документа (Last-Modified), ваш сайт будет проиндексирован. Однако в этом случае следует учитывать следующее:

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


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