Клиенты часто обращаются к нам после проведения SEO аудита за оптимизацией сайта на Drupal. Список рекомендаций практически всегда один и тот же, за исключением индивидуальных особенностей поддерживаемого проекта. Проанализировав статистику, заметили, что хоть нашу проблему и включают в отчет, заказчики и исполнители чаще всего игнорируют ее, потому что информации и опыта оказывается слишком мало. Это проблема - правильные заголовки ответа от сервера. Выдача корректных заголовков позволяет ускорить индексацию новых и измененных страниц сайта в несколько раз. 

Получен код 304 Not Modified. Если страница не изменилась с момента последнего обращения робота, рекомендуется выдавать этот код. Это ускорит индексирование и уменьшит трафик.

Источник: https://yandex.ua/support/webmaster/error-dictionary/http-codes.html#http-codes

Для начала разберемся, что это за заголовок ответа сервера и за что он отвечает. 

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

На сегодняшний день существуют разные механизмы кеширования, о которых можно почитать тут.

Нас интересует механизм кеширования с временной меткой. При посещении страницы браузер и сервер обмениваются заголовками. Заголовки, которые отправляет браузер на сервер, называют “Заголовки запроса”. А полученные в ответ заголовки от сервера называют “Заголовки ответа”. 

В заголовках ответа должна хранится строка Last-Modified с указанием даты последнего изменения файла. При первом посещении браузер кеширует файл и фиксирует указанную дату в кеше. При последующих посещениях в заголовки запроса добавляется строка If-Modified-since с указанием даты изменения закешированного файла. Сервер проверяет, если файл изменился после указанной даты, то выдает браузеру измененный файл с новой временной меткой Last-Modified. А если файл не изменился с указанной даты - то сервер возвращает заголовок ответа с кодом “304 Not Modified”. В том случае браузер не загружает данные с сервера и выводит файл из кеша.

Modified”. В том случае браузер не загружает данные с сервера и выводит файл из кеша. 

В 1999 году был принят протокол  HTTP/1.1, в котором появился  более надежный механизм кеширования E-tag. Но проверка валидности кеша по временной метке все еще важна. 

Дело в том, что поисковые системы при проверке сайта не сохраняют данные о метках кеша (E-tag), а также информацию о дате последнего изменения страницы (Last-modified). Но при этом они хранят информацию о последнем посещении страницы ботом. При следующих посещениях бот поисковой системы в качестве заголовка запроса  If-Modified-Since передает дату последнего посещения. И если страница не изменилась после указанной даты (возвращается ответ 304 Not Modified), то бот просто пропускает страницу и продолжает поиск нового и измененного контента по сайту. 

Давайте посчитаем:

Допустим на сайте есть 10000 товаров. Бот за 1 проход по сайту индексирует не более 1000 страниц (цифра выдуманная, реальные данные про настройки ботов нам не известны). Бот посещает сайт каждые 2 дня, для индексации. И все страницы уже добавлены в индекс. 

Предположим, что после последней индексации у нас изменились цены и скорректированы описания на определенные категории товаров (2000 товаров) и добавились новые товары (500 товаров). 

При некорректной обработке заголовков if-modified since для индексации бот должен пройти по всем страницам сайта. Учитывая вводные данные получится, что для индексации 2000 измененных страниц и 500 новых бот должен просмотреть все страницы сайта. (15000) страниц = 11 посещений сайта = 22 дня. 

Если же заголовки отдаются корректно, то все не измененные страницы будут проигнорированы ботом из-за заголовка 304 Not Modifed. В этом случае для индексации останется 2500 страниц = 3 посещения = 6 дней.

Получается, что ваши потенциальные покупатели в поисковой выдаче увидят изменения намного раньше, если настроены корректные заголовки. 

В CMS Drupal давно известна проблема с правильными ответами сервера, в частности с корректной выдачей заголовка ответа 304 Not-Modified. Проверка на заголовки кеширования происходит следующим образом: чтобы друпал вернул указанный заголовок, необходимо, чтобы заголовки запросов соответствовали следующим критериям: 

  1. Есть заголовок If-None-Match и есть заголовок If-Modified-Since;
  2. Значение If-Modified-Since должно быть равно последнему значению Last-modified;
  3. Значение If-None-Match должно быть равно значению E-tag.

В описанных пунктах есть несколько несоответствий официальной спецификации:

  1. В RFC 7232 (Секция 3-3) говорится, что получатель (сервер)  обязан игнорировать If-Modified-Since, если в запросе есть заголовок If-None-Match. 
  2. В RFC 2616 (Секция 13.3.4) говорится, что If-Modified-Since не должен возвращать 304  Not-Modifed, если не все остальные заголовки валидны. 

Учитывая данные 2 пункта можем сделать вывод, что для корректной проверки If-Modified-Since заголовка нужно убедиться, что заголовок If-None-Match отсутствует или валиден, перед тем как проверять If-Modified-Since заголовок. 

Но самая большая проблема указана в пункте 3 “Значение If-None-Match должно быть равно значению E-tag”. Как уже выше говорилось, браузеры сохраняют метку, полученную из заголовка ответа Last-Modified и в будущем передают именно ее для проверки на сервер. Поисковые системы же передают дату последнего посещения, и в 99.99% случаев эта дата не будет совпадать с датой последнего изменения страницы. А это значит, что поисковый бот гарантировано не будет получать ответ “304 Not Modified” на все запросы к Drupal сайту. 

Данная проблема присутствует как в 7 так и в 8 версии Drupal.

Мы создали патчи  для 7-ой и 8-ой версии. 

Drupal 7 - https://www.drupal.org/project/drupal/issues/3055984#comment-13213469 

Drupal 8 - https://www.drupal.org/project/drupal/issues/2259489#comment-13134143

Приятным бонусом стало то, что в Drupal 8 применимо внедрение зависимостей (Dependency Injection). Это в свою очередь предоставляет возможность менять все, что пожелаете, с помощью переопределения классов сервисов. И это позволило нам создать небольшой модуль Last Modified since header fix, который можно установить на ваш сайт до принятия патча разработчиками ядра Drupal 8. Модуль выполняет необходимые настройки и выдает корректные заголовки кеширования. 

Пользователям Drupal 7 придется использовать существующий патч на ядро. 

Нужно отметить, что некоторые серверы (хостинг) настроены так, что веб-сервер сам контролирует вышеуказанные заголовки и выдает их корректно. В этом случае проблему можно сразу и не заметить, но при переезде сайта на другой хост, она может “всплыть”. 


В данном контексте страница - это HTML файл страницы и все файлы, которые необходимы для отображения данной страницы, полученные с сервера.

Добавить комментарий

CAPTCHA