Заголовки Last-Modified и If-Modified-Since — ускоряем индексацию

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

В последнее время мне пришлось неоднократно столкнуться с тем, что некоторые SEO-специалисты, позиционирующиеся как не самые слабые профессионалы в отрасли, демонстрировали не совсем полное понимание того, как правильно управлять индексированием страниц сайта и вели речь только об отдаче заголовке Last-Modified, упуская из виду обработку запроса с заголовком If-Modified-Since. Поэтому хотелось бы остановиться на этом вопросе поподробней.

Итак, что такое заголовок Last-Modified и какую роль он играет при индексации?

Заголовок Last-Modified отдает время последнего изменения документа. Эта информация, несомненно, в какой-то мере полезна, и если этот заголовок не отдавать, то, к примеру, в Яндексе в сниппетах не будет показываться дата документа, и он также будет отсутствовать в результатах поиска, отсортированных по дате. Однако, собственно управлять индексацией с помощью этого заголовка невозможно.

Дело в том, что поисковый робот для документа, который он еще ни разу не индексировал, в первый раз задает запрос GET без всяких условий. А вот при повторном обращении к нему, он задает запрос с заголовком If-Modified-Since, в котором указывает дату предыдущей индексации документа. Вот, к примеру, выдержка из документации к продукту для поиска по корпоративным ресурсам Google Search Appliance: «During the recrawl of an indexed document, the Google Search Appliance sends the If-Modified-Since header based on the last crawl date of the document» («Во время повторной индексации проиндексированного документа, Google Search Appliance посылает заголовок If-Modified-Since, основанный на дате последней индексации документа» — здесь и далее перевод автора).

ПОЛЕЗНО  Заголовок Last-Modified ускоряет индексацию новых страниц в разы

И вот уже для ответа на запрос с заголовком If-Modified-Since согласно протоколу RFC2616 имеются следующие варианты:

a) If the request would normally result in anything other than a 200 (OK) status, or if the passed If-Modified-Since date is invalid, the response is exactly the same as for a normal GET. A date which is later than the server’s current time is invalid. (Если результат ответа на обычный запрос должен быть отличен от 200 (ОК), или если дата в If-Modified-Since некорректна, то ответ должен точно совпадать с ответом на обычный запрос GET. Дата, более поздняя, чем текущее время сервера, является некорректной).

b) If the variant has been modified since the If-Modified-Since date, the response is exactly the same as for a normal GET. (Если документ изменен с даты, указанной в If-Modified-Since, то ответ должен точно совпадать с ответом на обычный запрос GET.)

c) If the variant has not been modified since a valid If-Modified-Since date, the server SHOULD return a 304 (Not Modified) response. (Если документ не изменен с даты, указанной в If-Modified-Since, то сервер должен вернуть ответ 304 Not Modified.)

Таким образом, для документов, не изменившихся с даты предыдущей индексации, которая указывается поисковым роботом в заголовке If-Modified-Since, он должен получить ответ 304 и не скачивать их содержимое, расходуя квоту только на реально изменившиеся со времени предыдущей индексации или же новые документы, что, как было сказано выше, особенно важно для сайтов с большим количеством страниц. Однако следует обратить внимание, что при этом содержимое отдаваемого заголовка Last-Modified не суть важно, важен именно результат ответа на запрос с заголовком If-Modified-Since, и именно его необходимо корректно настраивать в первую очередь. И, кстати, нередки ситуации, когда вебмастера ограничиваются настройкой только отдачи заголовка Last-Modifed, забывая при этом о настройке корректной обработки ответа на запрос с заголовком If-Modified-Since. И в итоге задача управления индексацией остается нерешенной.

ПОЛЕЗНО  16 фильтров от Google

Проверить ответ сервера на запросы роботов Яндекса с добавлением заголовка If-Modified-Since можно в сервисе Яндекс.Вебмастер, правда, только для зарегистрированных в нем сайтов с подтвержденными правами на них: https://webmaster.yandex.ru/server-response.xml:

Заголовки Last-Modified и If-Modified-Since - ускоряем индексацию

Также есть специальный сервис http://last-modified.com/ru , который предоставляет возможность проверить любой сайт на корректность обработки заголовка If-Modified-Since. Однако, в отличие от сервиса Яндекс.Вебмастер, он не позволяет самостоятельно задавать дату в заголовке If-Modified-Since. Принцип его работы следующий – сначала он делает обычный запрос, и если в ответе сервера обнаруживает заголовок Last-Modified, то делает второй запрос уже с заголовком If-Modified-Since, в котором указывает дату, полученную из заголовка Last-Modified в предыдущем запросе:

Заголовки Last-Modified и If-Modified-Since - ускоряем индексацию

Проверить же ответ сервера для любого сайта на запрос с возможностью задать произвольную дату в заголовке If-Modified-Since, можно с помощью сервиса http://www.bertal.ru/index.php?ex=1

Ну, и в заключении я хотел бы привести пример ошибки, от которой я и хотел предостеречь в данной статье, а именно, когда разработчик ограничился только отдачей заголовка Last-Modified, не настроив при этом корректную обработку запроса If-Modified-Since:

Заголовки Last-Modified и If-Modified-Since - ускоряем индексацию

Видим, что дата в заголовке Last-Modified (Tue, 07 Apr 2015 20:22:47 GMT) старше даты запроса (Wed, 08 Apr 2015 21:24:50 GMT). То есть сервер отдает не текущую дату, как это часто бывает с динамическими сайтами, а действительно настроена отдача в заголовке Last-Modified даты, отличной от текущей. Однако на запрос с заголовком If-Modified-Since, содержащим дату, отдаваемую в Last-Modified, сервер отдает ответ не 304, а 200. Проверка через сервис bertral.ru с указанием даты, более поздней, чем содержащаяся в заголовке Last-Modified, это тоже подтверждает:

Заголовки Last-Modified и If-Modified-Since - ускоряем индексацию

Сергей Людкевич