О сканировании в декабре: кеширование HTTP

Понедельник, 9 декабря 2024 г.

Представляем наши рекомендации в отношении кеширования.

С развитием интернета количество страниц, сканируемых роботами Google, существенно возросло. Инфраструктура сканирования Google поддерживает и всегда поддерживала эвристические механизмы кеширования. Но количество запросов, ответы на которые можно получить из локального кеша, сократилось: 10 лет назад доля таких запросов составляла 0,026 %, и это совсем небольшая цифра. Теперь же она составляет всего 0,017 %.

Почему кеширование так важно

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

Если у вас крупный сайт, контент которого размещен на отдельных URL и меняется незначительно, локальное кеширование может повысить эффективность сканирования вашего сайта. Инфраструктура сканирования Google поддерживает эвристическое кеширование HTTP в соответствии со стандартом кеширования HTTP, в частности при помощи заголовка ответа ETag и заголовка запроса If-None-Match, а также при помощи заголовка ответа Last-Modified и заголовка запроса If-Modified-Since.

Мы настоятельно рекомендуем использовать ETag, поскольку это реже приводит к ошибкам (в отличие от значения Last-Modified его значение не структурировано). А если у вас есть возможность, то лучше настроить оба, интернет будет вам признателен.

Если говорить о том, при каких изменениях необходимо обновлять кеш на стороне пользователей, то здесь решать вам. Мы рекомендуем обновлять кеш при значительных изменениях контента. Изменение одной лишь даты сообщения об авторском праве внизу страницы вряд ли можно считать значительным.

Заголовки ETag и If-None-Match

Поисковые роботы Google поддерживают условные запросы на основе содержимого ETag в соответствии со стандартом кеширования HTTP. То есть, чтобы сообщить поисковым роботам Google о предпочтениях кеширования, в качестве значения Etag следует использовать любую строку ASCII (обычно это хеш содержимого или номер версии, но можно также использовать часть числа π), которая будет уникальным образом представлять контент, размещенный на странице. Если на одном и том же URL размещено несколько версий контента (например, мобильная версия страницы и версия для ПК), то для каждой версии должно быть свое уникальное значение ETag.

Поисковые роботы Google, поддерживающие кеширование, отправят значение ETag в ответ на предыдущее сканирование этого URL в заголовке If-None-Match header. Если значение ETag, отправленное поисковым роботом, совпадает с текущим значением, которое было сгенерировано сервером, то ваш сервер должен вернуть пустой ответ с кодом статуса HTTP 304 ("Не изменялось"). Есть несколько причин, по которым тело HTTP-запроса должно быть пустым:

  • вашему серверу не нужно тратить вычислительные мощности на генерирование контента, то есть это экономит ваши средства;
  • вашему серверу не нужно передавать тело HTTP-запроса, что также приводит к экономии.

На стороне клиента браузер или робот Googlebot могут извлечь контент, размещенный по этому URL-адресу, из внутреннего кеша клиента. Поскольку передача данных в этом случае не осуществляется, это происходит очень быстро, что не только нравится пользователям, но и позволяет им экономить ресурсы.

Заголовки Last-Modified и If-Modified-Since

Наряду с условными запросами на основе заголовков ETag поисковые роботы Google также поддерживают условные запросы Last-Modified based в соответствии со стандартом кеширования HTTP. Здесь применяется та же логика, что и с заголовками ETag: чтобы сделать ресурс кешируемым, используется идентификатор, и это обеспечивает те же преимущества, что и при использовании ETag на стороне клиента.

Вот несколько советов по использованию Last-Modified в качестве директивы кеширования:

  1. Формат даты в заголовке Last-Modified должен соответствовать стандарту HTTP. Чтобы избежать проблем с обработкой файла, рекомендуем использовать следующий формат даты: "день недели, DD Mon YYYY HH:MM:SS (часовой пояс)". Пример: Fri, 4 Sep 1998 19:15:56 GMT.
  2. Также советуем использовать поле max-age заголовка Cache-Control, чтобы помочь поисковым роботам определять, требуется ли повторное сканирование определенного URL. Укажите в поле max-age длительность периода в секундах, в течение которого контент не будет изменяться. Пример: Cache-Control: max-age=94043.

Примеры

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

ETag/If-None-Match Last-Modified/If-Modified-Since
Ответ сервера на запрос сканирования. Это ответ, из которого поисковый робот может сохранить поля заголовков ETag и Last-Modified, содержащих условие для выполнения запроса.
HTTP/1.1 200 OK
Content-Type: text/plain
Date: Fri, 4 Sep 1998 19:15:50 GMT
ETag: "34aa387-d-1568eb00"
...
HTTP/1.1 200 OK
Content-Type: text/plain
Date: Fri, 4 Sep 1998 19:15:50 GMT
Last-Modified: Fri, 4 Sep 1998 19:15:56 GMT
Cache-Control: max-age=94043
...
Последующий условный запрос поискового робота. Условный запрос на основе значений заголовков, сохраненных во время предыдущего запроса. Значения в заголовках запроса If-None-Match и If-Modified-Since отправляются обратно на сервер для проверки.
GET /hello.world HTTP/1.1
Host: www.example.com
Accept-Language: en, hu
User-Agent: Googlebot/2.1 (+http://www.google.com/bot.html)
If-None-Match: "34aa387-d-1568eb00"
...
GET /hello.world HTTP/1.1
Host: www.example.com
Accept-Language: en, hu
User-Agent: Googlebot/2.1 (+http://www.google.com/bot.html)
If-Modified-Since: Fri, 4 Sep 1998 19:15:56 GMT
...
Ответ сервера на условный запрос. Поскольку условия в значениях заголовков, отправленных поисковым роботом, проверяются на стороне сервера, сервер возвращает поисковому роботу код статуса HTTP 304 (с пустым телом). Это будет происходить с каждым последующим запросом до тех пор, пока проверка условий не завершится ошибкой (дата ETag или Last-Modified меняется на стороне сервера).
HTTP/1.1 304 Not Modified
Date: Fri, 4 Sep 1998 19:15:50 GMT
Expires: Fri, 4 Sep 1998 19:15:52 GMT
Vary: Accept-Encoding
If-None-Match: "34aa387-d-1568eb00"
...
HTTP/1.1 304 Not Modified
Date: Fri, 4 Sep 1998 19:15:50 GMT
Expires: Fri, 4 Sep 1998 19:15:51 GMT
Vary: Accept-Encoding
If-Modified-Since: Fri, 4 Sep 1998 19:15:56 GMT
...

Если вы хотите сделать свой ресурс более удобным для пользователей, а также немного сэкономить на трафике, обратитесь к вашему хостинг-провайдеру, поставщику своей CMS или разработчикам, чтобы для вашего сайта включили HTTP-кеширование. При прочих равных условиях это сделает ваш сайт немного более привлекательным.

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


Хотите узнать больше? Прочитайте все записи из серии "О сканировании в декабре"