Логотип seo-prodvizhenie-biznesa.ru
+7 (921) 333-77-45

Внутрихостовая директива: оптимизация и безопасность веб-сервера

Внутрихостовая директива: оптимизация и безопасность веб-сервера
Анатолий Кузнецов
Анатолий Кузнецов
SEO-оптимизатор с 20-летним стажем. Автор блога seo-prodvizhenie-biznesa.ru о продвижении и доработке сайтов.

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

В SEO я с 2005 года, и доля проблем, которые лечатся не текстами и не ссылками, а десятью строками в конфигурации хоста, за это время не уменьшилась. Ниже — где эти строки лежат в Apache, nginx и .htaccess, в каком порядке они применяются, какие из них влияют на индексацию и скорость, что закрывают ради безопасности и как проверить, что написанное вами вообще сработало.

Где лежат внутрихостовые директивы

Конфигурация сервера устроена уровнями: глобальные настройки, настройки конкретного виртуального хоста, настройки отдельной директории. Внутрихостовыми называют те, что действуют внутри блока одного сайта.

В Apache блок сайта выглядит как <VirtualHost *:443> и содержит внутри себя ServerName, DocumentRoot, вложенные блоки <Directory> и <Location>. В nginx та же роль у блока server { ... } с директивами server_name, root и вложенными location. Логика одинаковая, синтаксис разный.

Отдельная история — файл .htaccess. Это способ задать директивы уровня директории, не имея доступа к основной конфигурации: файл кладётся в папку сайта и читается Apache при каждом запросе. Именно с ним чаще всего работает владелец сайта на обычном хостинге. У nginx аналога нет вовсе: там всё правится в конфигурации и требует перезапуска.

Где Что задаёт Когда применяется Нужен доступ
Глобальная конфигурация Общие правила для всех сайтов сервера При старте сервера Root или панель управления
Блок VirtualHost или server Настройки одного сайта При старте сервера Root или панель управления
Блок Directory или location Настройки одного раздела сайта При старте сервера Root или панель управления
Файл .htaccess Правила для папки и вложенных папок При каждом запросе Достаточно FTP

Практическое следствие из последней строки таблицы: .htaccess удобен, но обходится процессорным временем — сервер читает файл на каждый запрос и проверяет его во всех родительских папках. На нагруженном сайте перенос правил в конфигурацию хоста даёт заметный выигрыш. На обычном сайте разница не критична, и удобство перевешивает.

Порядок применения: почему правило не срабатывает

Самая частая жалоба звучит так: «правило написал, а оно не работает». Почти всегда причина в порядке.

  • Директивы более узкого уровня перекрывают широкие. Правило в .htaccess подпапки отменяет правило из корня, если оно про то же самое.
  • Правила перезаписи адресов выполняются сверху вниз. Первое сработавшее правило с флагом остановки прекращает обработку остальных.
  • Директива AllowOverride может запрещать .htaccess вовсе. Если в конфигурации хоста стоит AllowOverride None, ваш файл просто не читается.
  • Nginx перед Apache отдаёт статику сам. В типичной связке картинки, стили и скрипты не доходят до Apache, и правила из .htaccess к ним не применяются вообще.
  • Кэш браузера хранит старый редирект. Постоянный редирект браузер запоминает и продолжает выполнять даже после удаления правила.

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

Один сайт — один адрес

Классическая ситуация: сайт открывается по адресу с www и без, по протоколу http и https, а иногда ещё и по IP-адресу сервера или техническому домену хостинга. Для поиска это несколько копий одного сайта, между которыми размывается вес и путается индекс.

Лечится директивами уровня хоста. Порядок такой:

Подробнее об этом — в статье «Поисковая оптимизация интернет-сайтов».

  1. Выбрать основной адрес — с www или без, разницы для продвижения нет, важна только неизменность.
  2. Настроить постоянный редирект со всех остальных вариантов на основной, одним шагом, без промежуточных переходов.
  3. Проверить, что редирект отдаёт код 301, а не 302 и не цепочку из двух-трёх переходов.
  4. Закрыть доступ по IP и по техническому домену хостинга — либо редиректом, либо отдачей кода 444 в nginx.
  5. Указать основной адрес в Яндекс.Вебмастере и убедиться, что канонические ссылки на страницах ведут на него же.

Про цепочки редиректов. Схема, при которой http без www ведёт на http с www, затем на https с www, а оттуда на https без www, работает для человека и вредит сайту: каждый переход теряет часть веса, увеличивает время до первого байта и создаёт риск обрыва. Правило простое — от любого входного адреса до конечного не более одного перехода.

Редиректы и правила перезаписи

Редирект — самая используемая внутрихостовая директива и самый частый источник аварий. Разница между кодами ответа принципиальна и путается постоянно.

Код Смысл Когда применять Что делает поиск
301 Перемещено навсегда Смена адреса, склейка зеркал, объединение страниц Заменяет старый адрес новым, переносит накопленные сигналы
302 Временно перемещено Технические работы, временная замена страницы Оставляет в индексе старый адрес
307 Временно, с сохранением метода запроса Формы и API Так же, как 302
404 Не найдено Страницы никогда не было или она удалена без замены Постепенно убирает адрес из индекса
410 Удалено навсегда Осознанно удалённые разделы Убирает адрес быстрее, чем 404

Помогу с продвижением: SEO-продвижение от Анатолия Кузнецова — вывожу сайты в топ Яндекса белыми методами.

Отдельно про массовые редиректы при переезде. Правило «всё старое на главную» — самая дорогая ошибка при смене структуры сайта: поиск трактует такой редирект как отсутствие соответствия и обнуляет накопленное. Каждый старый адрес должен вести на страницу с тем же смыслом, а если такой нет — отдавать 404 или 410. Список соответствий готовится заранее, а не в ночь переезда.

Если интересно направление с сайтами — базу даю в своём курсе:

Ещё один частый сценарий — переезд сайта на другой сервер. Файлы копируют, базу переносят, домен переключают, а конфигурацию хоста собирают заново с нуля, и все накопленные за годы правила остаются на старой машине. Внешне сайт работает, поэтому проблему замечают через две-три недели по падению трафика: перестали действовать редиректы со старых адресов, вернулись доступные копии с www, отвалились правила блокировки. Перед переездом нужно выгрузить действующую конфигурацию и .htaccess целиком и переносить их как часть сайта, наравне с файлами и базой.

Кэширование и сжатие на уровне хоста

Две директивы, дающие ощутимый прирост скорости без единой правки в коде сайта.

Сжатие. Сервер отдаёт HTML, CSS, JS и шрифты в сжатом виде — gzip или более экономный brotli. Объём передаваемых данных падает в три-четыре раза. Картинки и видео сжимать повторно не нужно: они уже сжаты своими форматами, и попытка даёт только нагрузку на процессор.

Тему разбирал отдельно: «Оптимизация сайта под мобильные устройства».

Заголовки кэширования. Директивы Cache-Control и Expires сообщают браузеру, сколько хранить файл локально. Разумные сроки различаются по типам файлов.

Тип файла Срок хранения Замечание
Картинки, шрифты от 30 дней до года Меняются редко
CSS и JS от 7 до 30 дней Обязательна версия в имени файла или в параметре
HTML страниц от нескольких минут до часа Долгий срок мешает видеть правки
Личный кабинет, корзина не кэшировать Иначе посетители видят чужие данные

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

Обработка ошибок — вопрос не только удобства

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

  • Своя страница 404. С поиском по сайту, ссылками на основные разделы и понятным объяснением. Пустая страница сервера отправляет посетителя обратно в выдачу.
  • Правильный код ответа. Красивая страница «ничего не найдено», отдающая код 200, — это «мягкая» ошибка: поиск считает адрес рабочей страницей и держит его в индексе. Проверяется только инструментом, глазами не видно.
  • Страница 403. Появляется при блокировке доступа и не должна выглядеть как поломка сайта.
  • Страница 5xx. При аварии сервер должен отдавать именно 503 с указанием повторить позже, а не 200 с текстом об ошибке: 503 сообщает роботу подождать и не выбрасывать страницы из индекса.
  • Логирование. Отдельные логи по хосту позволяют увидеть всплеск 404 и 5xx до того, как о нём сообщит Вебмастер.

Безопасность: что закрывают на уровне хоста

Виртуальный хост — правильное место для запретов: они действуют раньше, чем запрос дойдёт до движка сайта, и не зависят от плагинов.

  • Служебные файлы. Резервные копии, дампы базы, файлы конфигурации, каталог .git. Оставленный в корне архив сайта — самый частый способ, которым сливают базы.
  • Листинг директорий. Директива Options -Indexes закрывает просмотр содержимого папок без индексного файла.
  • Выполнение скриптов в папке загрузок. Если через форму загрузили файл с расширением скрипта, он не должен исполняться.
  • Скрытие версии сервера. ServerTokens Prod и server_tokens off убирают точную версию из заголовков ответа.
  • Заголовки безопасности. X-Content-Type-Options, X-Frame-Options, Referrer-Policy, а на сайтах с оплатой — Strict-Transport-Security.
  • Ограничение доступа к админке по IP. Работает, если у вас фиксированный адрес; иначе однажды заблокируете себя.

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

Блокировка ботов и ограничение нагрузки

Если нужна помощь по теме — мой курс по SEO.

Паразитный трафик — парсеры, сканеры уязвимостей, накрутка поведенческих факторов — режется тем же уровнем конфигурации. Инструментов три.

  1. Запрет по подсетям. Точечно и эффективно, если атака идёт с ограниченного диапазона адресов. Списки собираются по логам сервера, а не по данным аналитики.
  2. Ограничение частоты запросов. В nginx это limit_req, задающий предел числа обращений с одного адреса в секунду. Работает против переборов и агрессивных парсеров.
  3. Фильтрация по строке User-Agent. Полезна против ленивых парсеров и бесполезна против тех, кто представляется браузером.

Два предупреждения. Первое: никогда не блокируйте по признакам, под которые попадают роботы поисковых систем. Проверяйте принадлежность робота обратным запросом по IP, а не по названию в User-Agent — им прикрываются в первую очередь. Второе: правила блокировки в .htaccess и в конфигурации хоста регулярно теряются при обновлении панели управления или переносе сайта. Держите их в отдельном файле, ведите копию вне сервера и проверяйте раз в месяц, что блокировка действует.

Смежный материал по теме — «Внутренняя SEO оптимизация сайта».

Полезная привычка — держать все запреты в одном файле с комментариями: что за правило, зачем добавлено и когда. Конфигурация хоста живёт годами и переживает нескольких исполнителей, а строка без пояснения через год выглядит как мусор, который хочется удалить. Половина аварий после «наведения порядка в конфиге» происходит именно так.

Как проверить, что директива работает

Настройка считается сделанной не после сохранения файла, а после проверки ответа сервера.

  • Код ответа и заголовки. Смотреть инструментом проверки ответа сервера в Яндекс.Вебмастере или консольной командой запроса заголовков. Браузер показывает конечную страницу и скрывает цепочку.
  • Цепочка редиректов. Проверять от всех четырёх вариантов адреса: http и https, с www и без.
  • Сжатие. В заголовках ответа должен быть Content-Encoding с указанием метода.
  • Кэширование. Проверять заголовок Cache-Control отдельно для картинки, стиля и HTML — они настраиваются по-разному.
  • Ошибки. Открыть заведомо несуществующий адрес и убедиться, что код именно 404, а не 200.
  • Проверка синтаксиса до применения. И Apache, и nginx умеют проверять конфигурацию без перезапуска — ошибка в одной строке иначе роняет все сайты сервера.

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

Частые вопросы

Чем .htaccess отличается от настроек виртуального хоста? Уровнем и скоростью. Файл действует на папку и читается при каждом запросе, конфигурация хоста действует на весь сайт и читается при старте сервера. Возможности почти совпадают, но часть директив в .htaccess недоступна.

Почему правила из .htaccess не работают на nginx? Nginx этот файл не читает вовсе и никогда не читал. В связке nginx с Apache файл работает только для тех запросов, которые доходят до Apache, — то есть обычно не для статики.

С www или без — что лучше для продвижения? Разницы нет. Значение имеет только то, что вариант выбран один и все остальные ведут на него одним постоянным редиректом.

Можно ли закрыть сайт от лишних роботов через robots.txt? Файл robots — рекомендация, и её соблюдают только добросовестные роботы. Паразитный трафик режется на уровне сервера, а не рекомендацией.

Сколько хранить логи? Достаточно двух-трёх месяцев с ротацией. Этого хватает, чтобы разобрать всплеск нагрузки или найти дату начала атаки, и логи не съедают диск.

Опасно ли включать сжатие для всего подряд? Не опасно, но бессмысленно для уже сжатых форматов — картинок, видео, архивов. Настраивайте по списку типов, а не поголовно.

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

Коротко

  • Внутрихостовые директивы задают поведение конкретного сайта: адрес, редиректы, кэш, ошибки, запреты; в Apache это блок VirtualHost, в nginx — блок server.
  • Файл .htaccess даёт те же возможности без доступа к серверу, но читается при каждом запросе и не работает в nginx.
  • Правило «не срабатывает» почти всегда объясняется порядком применения, запретом AllowOverride, отдачей статики мимо Apache или закэшированным старым редиректом.
  • Один сайт должен открываться по одному адресу, а любой другой вариант — вести на него ровно одним переходом с кодом 301.
  • Сжатие и заголовки кэширования дают прирост скорости без правок в коде; персональные страницы из кэша исключают явно.
  • Страница 404 обязана отдавать код 404, а не 200: «мягкие» ошибки держат несуществующие адреса в индексе.
  • Блокировки и запреты держат на уровне хоста, проверяют раз в месяц и никогда не применяют к проверенным роботам поисковых систем.

Если сайт открывается по нескольким адресам, отдаёт странные коды ответа или медленно откликается, а причина не находится, приходите на SEO-консультацию: проверим ответы сервера и цепочки редиректов вместе и составим список правок для вашего хостинга.

Увеличьте позиции и продажи вашего сайта

Профессиональное SEO-продвижение с гарантией результата. Выберите подходящую услугу:

Анатолий Кузнецов — SEO-оптимизатор

Остались вопросы по продвижению?

Меня зовут Анатолий Кузнецов, я SEO-оптимизатор с 20-летним стажем. Разберу ваш сайт, отвечу на вопросы и подскажу, что улучшить для роста позиций в Яндексе и Google.

Связаться со мной →

Комментарии

Яков Хренников

Пункт про nginx перед Apache объясняет месяц моих мучений. Прописывал заголовки кэширования в .htaccess, проверял — на HTML работает, на картинках нет. Думал, что ошибся в синтаксисе, переписывал раз десять. А статику просто отдавал nginx, и до Apache она не доходила.

Анатолий Кузнецов автор

Это, пожалуй, самая изматывающая ловушка типовой связки, потому что правило синтаксически верное и ошибок нигде не показывает. Порядок решения такой. Первое: определите, что именно у вас отдаёт nginx — обычно это список расширений в конфигурации хоста, и в панели управления он редактируется через отдельное поле. Второе: заголовки для статики пропишите там же, на стороне nginx, а в .htaccess оставьте только правила для страниц. Третье: проверяйте не браузером, а запросом заголовков — на картинке и на HTML отдельно, потому что источники ответа у них разные. И учтите обратную сторону этой схемы: правила блокировки по IP в .htaccess тоже не действуют на статику, поэтому парсер картинок ими не остановить.

Полина Цвиркун

Про цепочки редиректов проверила все четыре варианта адреса, как советуете. От http с www до конечного адреса оказалось три перехода. Причём каждый ставил свой человек в разное время, и никто не смотрел на общую картину.

Никита Черепанов

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

Анатолий Кузнецов автор

Нагрузку смена адреса действительно снимает, тут спорить не с чем — перебор идёт по стандартным путям, и на нестандартном его просто нет. Возражение относится не к эффективности, а к цене отказа. Когда адрес входа переопределён плагином или правилом в конфигурации, любое обновление, конфликт или перенос сайта может оставить вас без доступа к собственной админке, и восстановление идёт через базу или файлы. Второе: часть форм и служебных обработчиков ломается вместе с переопределением, и обнаруживается это не сразу, а по пропавшим заявкам. Если решение уже работает и вы знаете, как войти в обход, — оставляйте. Но обязательно запишите порядок восстановления доступа и проверьте, что формы на сайте отправляются.

Стефания Хатунцева

Про мягкие 404 — открыла несуществующий адрес, страница красивая, с меню и поиском. Проверила код ответа: 200. За два года в индекс набежало почти четыреста несуществующих адресов, и никто не понимал, откуда они берутся.

Мирон Цыбров

Вопрос по 503. Сайт периодически падает под нагрузкой, хостинг в такие моменты отдаёт свою заглушку. Как понять, с каким кодом она отдаётся, если поймать момент падения вручную почти невозможно?

Анатолий Кузнецов автор

Ловить вручную и не нужно, есть три источника. Первый: в Яндекс.Вебмастере раздел с ошибками обхода показывает, какие коды получал робот и когда, — там видно и частоту, и точное время. Второй: логи сервера, где коды ответа стоят в каждой строке; отфильтруйте по 5xx за месяц и получите картину. Третий: любой внешний мониторинг доступности с интервалом в минуту — он фиксирует и код, и длительность недоступности. Дальше по этим данным разговаривайте с хостингом: если заглушка отдаётся с кодом 200, робот считает, что на всех адресах сайта лежит одинаковый текст об ошибке, и последствия для индекса гораздо хуже, чем от честной пятисотки.

Агафья Чулкова

Нашли в корне архив сайта двухлетней давности с дампом базы, лежал в открытом доступе по предсказуемому имени. Оставил подрядчик, который делал переезд. Раздел про служебные файлы стоит перечитывать раз в полгода просто как чеклист.

Данила Ховрин

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

Тамара Целикова

Есть вопрос по блокировке ботов. Вычислили две подсети, с которых идёт накрутка, добавили запрет. Через месяц заходы вернулись. Проверили файл — правила на месте, синтаксис верный, но не действуют. В чём может быть причина?

Анатолий Кузнецов автор

Проверьте три вещи по порядку. Первая: не переехал ли бот на соседние подсети — сравните адреса из свежих логов с теми, что заблокированы, часто отличается только третий октет, и нужен запрет на диапазон целиком. Вторая: доходят ли эти запросы до того уровня, где стоит правило, — если перед Apache стоит nginx или кэширующий слой, запрос может обслуживаться раньше, чем правило вообще прочитается. Третья: не переписала ли панель управления файл конфигурации при обновлении — такое случается регулярно, и правила исчезают целыми блоками, оставаясь на вид в другом файле, который уже не подключается. Проверяется всё это одним способом: сделайте запрос с заблокированного адреса и посмотрите код ответа в логе.

Игорь Чугунов

Совет сохранять копию файла с датой в имени — банальность, которую все игнорируют, пока не положат сайт вечером пятницы. Положили. Теперь копия делается автоматически перед каждой правкой.

Анфиса Хлудова

Про редирект всех старых адресов на главную — именно так нам сделало агентство при смене структуры каталога. Восемьсот адресов на главную страницу. Трафик из поиска упал вчетверо и не вернулся даже после того, как редиректы переделали постранично.

Анатолий Кузнецов автор

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

Роман Цытович

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

Матвей Чирикин

Проверка синтаксиса конфигурации перед перезапуском спасла меня дважды за месяц. Опечатка в одной строке роняет вообще все сайты на сервере, а не только тот, который правишь. Тем, кто работает через панель хостинга, — ищите кнопку проверки, она обычно есть.

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

 Нажимая «оставить комментарий» вы принимаетеправила конфиденциальности 

Прокрутить вверх