Как HTTP-заголовки веб-сервера могут влиять на SEO и как автоматически это проверить
При продвижении сайта как-то незаслуженно мало уделяют внимания HTTP-заголовкам. А ведь от них напрямую зависит:
- Скорость загрузки страницы.
- Количество обращений браузера к сайту для загрузки страницы.
- Безопасность сайта и уровень доверия поисковика.
- Доверие к дате последней модификации контента, частоте изменения контента и важности контента.
- Корректность кодировки и языка.
Разберём далее каждую особенность подробнее.
Скорость загрузки страницы и количество обращений к серверу
Годы идут а за последние 25 лет с момента появления Всемирной паутины сайтов World Wide Web принципиально проблема быстрой загрузки не изменилась. В 90-е годы мы с трудом скачивали страницы на модемах. Сейчас, конечно, в среднем контент стал грузиться существенно быстрее. Но скорость загрузки во-первых важна для поисковиков и влияет на оценку того же Google Page Speed, а во-вторых мы по-прежнему сталкиваемся с перегруженными каналами, серверами, плохой сотовой связью или удалением от вышек. И для таких случаев имеет принципиальное отличие грузить 1Мб или 0.5Мб. Загрузить страницу за 20 или за 5 обращений к серверу.
На скорость загрузки страницы влияют:
- Версия протокола HTTP/1.1 или HTTP/2.
- Заголовок сжатия текстового контента Content-Encoding.
- ETag в сочетании с Cache-Control: max-age.
Отлично, если сервер поддерживает HTTP/2, тогда всё передаётся в рамках одного соединения. А в HTTP/1.1 для загрузки каждого файла браузер устанавливает новое соединение с сервером. На странице может подключаться ещё 20 картинок, JS-файлов, CSS-файлов, шрифтов, что в сумме притормозит загрузку и отображение контента.
Весь текстовый контент должен сжиматься сервером, то есть архивироваться. При этом алгоритм сжатия должен использоваться тот, который поддерживает клиент.
Весь статический контент сайта, который не меняется должен выдаваться с заголовками ETag, Cache-Control: max-age. Потому что когда посетитель перейдёт на вторую страницу сайта, то браузер не должен заново грузить картинки, JS, CSS, шрифты. Браузер должен взять это из кэша. А чтобы браузер взял эти файлы из кэша, ему нужно сообщить уникальный ETag этих файлов и сколько браузер может брать их из кэша. Как правило, это год или месяц. Через месяц или год браузер переспросит сервер If-None-Match, а не изменились ли эти файлы. Если не изменились, то сервер должен ответить 304 Not Modified. А если изменились, то выдать новые.
От корректности данных заголовков зависит скорость загрузки. Представьте, что сервер не выдаёт ETag, но выдаёт Cache-Control. Или выдаёт ETag, но не говорит сколько можно хранить кэш. А иногда веб-сервера выдают полную муть, что кешировать нельзя ничего и никогда. Или на запрос If-None-Match выдаёт всегда контент.
Безопасность сайта и уровень доверия поисковика
Безопасности уделяется всё больше и больше внимания. За последние несколько лет почти исчезли сайты без SSL-сертификатов. Поисковики ниже ранжируют http чем защищённые сайты с https. Браузеры ранжируют даже сертификаты и подсвечивают самые надёжные зеленым цветом.
Но даже имея самый крутой SSL-сертификат. Вы рискуете нарваться на смешанный контент, который приведёт к тому, что тот же Яндекс не присвоит вашему сайту значок SSL (защищённое соединение) и будет думать про него, что он небезопасный. Происходит это потому что на странице вашего сайта подключаются какие-то файлы по протоколу http, а не https.
Тут нам на помощь придут заголовки:
- Strict-Transport-Security
- Content-Security-Policy или Content-Security-Policy-Report-Only
Strict-Transport-Security принудительно заставит браузер запрашивать файлы по протоколу https, а даже если в коде будет что-то типа img src=http://…
Content-Security-Policy просто запретит браузеру подгружать данные по незащищённому http.
Content-Security-Policy имеет массу других полезных опций, он ограничивает список внешних ресурсов с которых страница сайта может подгружать данные. Одним из самых прекрасных свойств этого заголовка является запрет встроенных стилей и встроенных javascript. Хорошая разработка должна разделять отдельно HTML, CS и JS по разным файлам и не устраивать помойку в коде и страницах.
Когда я столкнулся с настройкой этого заголовка оказалось, что Яндекс.Метрика и чат Usedesk нарушают этот заголовок и используют inline стили. Usedesk морозились и в результате они отказались от нас, а мы от них. А Яндекс.Метрика молодцы! Приняли мои замечания и поправили код Яндекс.Метрики. Благо я даже подсказал им и конкретные строки на которые браузер ругается и как именно поправить. Саня, я тебе говорил, что РИФ говно, статьи надо писать. Там за день 500 человек мимо стенда пройдут, а тут 5000 прочтут. Давно уже никто не бухает. И бухая ничего не продашь. Давай вноси правки.
Last-Modified
Часто сервер не выдаёт данный заголовок вообще или выдаёт неправильно. Возможно поисковый робот и не обращает на это внимания. Заходит он раз в день на сайт, получает абсолютно тот же контент, что и днём ранее и годом ранее, и при этом север утверждает, что контент был модифицирован только что. Ну и кому такое должно понравиться?
Vary
Данный заголовок сообщает от каких других заголовков зависит отдаваемый контент. Например, он зависит от Content-Encoding.
Корректность кодировки и языка
Поисковики Яндекс и Google ранжируют контент в зависимости от языка пользователя. Если сайт использует устаревшую кодировку на каких-то страницах, например, windows-1251 или KOI8-R или ещё какую-то кодировку, которая однозначно говорит о языке, но при этом сам сервер в заголовке всем страницам выдаёт принудительно UTF8, то это вызовет проблемы. Причём браузер может в некоторых нестыковках и автоматически отобразить страницу корректно. Раньше в браузерах было переключение кодировки для этих целей, но с переходом на UTF8 проблема исчезла. Однако, её остаются сайты со старыми кодировками и нужно для них проверять, чтобы кодировки в заголовках ответа веб-сервера совпадали с кодировками страниц.
Заключение
Там ещё много параметров. Наверное вы уже утомились читать, а проверять это всё руками вообще сложная задача. Поэтому есть сервис для автоматической проверки HTTP-заголовков онлайн, который проанализирует заголовки, проверит как сервер реагирует на заголовки HTTP-запроса и выдаст рекомендации, что стоит поправить.
Внёс ли Саня правки в итоге?
Бухает, наверное
:))
Мы поколдовали по вашим правкам на https://loading.express и получили 45/50:
https://http.itsoft.ru/?url=https%3A%2F%2Floading.express&accept=text%2Fhtml%2Capplication%2Fxhtml%2Bxml%2Capplication%2Fxml%3Bq%3D0.9%2Cimage%2Fwebp%2Cimage%2Fapng%2C*%2F*%3Bq%3D0.8%2Capplication%2Fsigned-exchange%3Bv%3Db3%3Bq%3D0.9&accept_en=gzip%2C+deflate%2C+br&accept_lang=en&if_modified_since=&if_none_match=&user_agent=Mozilla%2F5.0+%28Windows+NT+10.0%3B+Win64%3B+x64%29+AppleWebKit%2F537.36+%28KHTML%2C+like+Gecko%29+Chrome%2F81.0.4044.129+Safari%2F537.36&h1=&v1=&h2=&v2=&h3=&v3=&h4=&v4=&h5=&v5=&http_version=2&method=GET&timeout=2&postdata=#h2_http_request
1️⃣ content-security-policy не содержит 'report-sample'. -1 балл.
2️⃣ content-security-policy содержит 'unsafe-inline'. -4 балла.
Если первое исправить, то в Safari и файрфокс в консоли сыпет ошибками.
Если исправить второе, то стили не будут работать, потому что у нас они inline и в нашем случае это безопасно, потому что у нас нет UGC.
Спасибо вам еще раз за сервис. Вы Молодцы!
Так включите content-security-policy-report-only:
Ну инлайн стили как и инлайн скрипты просто говорят о том, что это нехорошо. Понятно, что кто не без греха.
Странные ошибки. Как они могут влиять на скорость загрузки?
У нас сайт и там есть "ошибки", но если их исправить, то работа сервиса будет остановлена, а еще страница станет тяжелее. Причем тут скорость работы — не ясно.
https://http.itsoft.ru/?url=https%3A%2F%2Floading.express&accept=text%2Fhtml%2Capplication%2Fxhtml%2Bxml%2Capplication%2Fxml%3Bq%3D0.9%2Cimage%2Fwebp%2Cimage%2Fapng%2C*%2F*%3Bq%3D0.8%2Capplication%2Fsigned-exchange%3Bv%3Db3%3Bq%3D0.9&accept_en=gzip%2C+deflate%2C+br&accept_lang=en&if_modified_since=&if_none_match=&user_agent=Mozilla%2F5.0+%28Windows+NT+10.0%3B+Win64%3B+x64%29+AppleWebKit%2F537.36+%28KHTML%2C+like+Gecko%29+Chrome%2F81.0.4044.129+Safari%2F537.36&h1=&v1=&h2=&v2=&h3=&v3=&h4=&v4=&h5=&v5=&http_version=2&method=GET&timeout=2&postdata=#h2_http_request
и ссылки у вас конечно, коротенькие..))
Выше в статье описано как. У вас противоречия в логике заголовков. Админа напрягите разобраться.
Зато у нас наглядно видно какие параметры переданы. Для коротких ссылок полно других сервисов.
На скорость загрузки это влияет в десятой очереди. Прежде всего надо работать над фронт и бек сайта. HTTP-заголовки тоже надо держать в тонусе и в правильном состоянии. Это факт. Спасибо вам за статью и сервис! Многие даже не знают, что есть какие-то HTTP-заголовки, которыми надо тоже управлять.
P.S. Админа напряжем. Тоже спасибо!
Замечательная статья на сайте который сам еле набрал 21 бал .. в сервисе которой продает статья)) проверил десяток топ сайтов у всех не выше 22 баллов.. наверное все тупые)
Это повод обратить внимание.
Теперь по сути проверки заголовков vc.ru:
отчёт не отслеживают.
Допускают в HTML-коде CSS и JS.
content-security-policy содержит 'unsafe-eval'. -4 балла.
content-security-policy содержит 'unsafe-inline'. -4 балла.
Теперь проверим картинку с vc.ru https://vc.ru/life/133018-kak-my-byli-robinzonami-na-neobitaemom-ostrove-mozhno-li-vyzhit-na-neobitaemom-ostrove-v-tihom-okeane
Не используйте no-cache в параметре Cache-Control.
Last-Modified отсутствует. Страница должна знать про себя когда она изменялась в последний раз. Как минимум это случилось только что. -5 баллов.
Отсутствует Etag, а он должен быть даже если страница выдаёт динамический контент. -5 балла.
То есть картинки браузер все должен заново грузить каждый раз. Это бред.
Это из бесспорного на мой взгляд. С остальным можно поспорить. Но если реализовать хуже не станет.
Недостатки есть везде. Кто-то их устраняет, кто-то нет. Яндекс.Метрика устранили недостатки на которые я им указал в ходе создания данного сервиса.
———
А разве для картинок, JS, CSS, шрифтов не в .htaccess прописывается например так:
#кеш браузеров
ExpiresActive On
#по умолчанию кеш в 5 секунд
ExpiresDefault "access plus 5 seconds"
# Включаем кэширование изображений и флэш на одну неделю
ExpiresByType image/x-icon "access plus 1 week"
ExpiresByType image/jpeg "access plus 1 week"
ExpiresByType image/png "access plus 1 week"
ExpiresByType image/gif "access plus 1 week"
ExpiresByType application/x-shockwave-flash "access plus 1 week"
# Включаем кэширование css, javascript и текстовых файлоф на одну неделю
ExpiresByType text/css "access plus 1 week"
ExpiresByType text/javascript "access plus 1 week"
ExpiresByType application/javascript "access plus 1 week"
ExpiresByType application/x-javascript "access plus 1 week"
# Включаем кэширование html и htm файлов на один день
ExpiresByType text/html "access plus 1 day"
# Включаем кэширование xml файлов на десять минут
ExpiresByType application/xhtml+xml "access plus 10 minutes"
Заголовки и там прописываться могут и в httpd.conf и вообще там может быть совсем не Apache, тогда htaccess просто нет.
А как все эти настройки влияют на СЕО?
304 - понятно, как. как другие настройки влияют на сео?
Какие были проведены эксперименты и полученные результаты?