«Хороший сайт делается для людей, а поисковики приходят следом»

— из принципов редакции SeoLiga.ru
Главная » Статьи » Веб-программирование » Настройка .htaccess: редиректы и защита

Настройка .htaccess: редиректы и защита

Файл .htaccess — одна из самых полезных вещей в арсенале вебмастера на виртуальном хостинге. Когда нет доступа к основному конфигу сервера, именно он позволяет настроить перенаправления, красивые адреса, защиту и кэширование. Но у него есть и обратная сторона: одна лишняя запятая или неверное правило — и весь сайт отдаёт ошибку сервера.

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

Как работает .htaccess

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

Важные особенности:

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

Если после правки сайт отдаёт ошибку сервера, значит, где-то синтаксическая ошибка или неразрешённая директива. Верните прежнюю версию и добавляйте правила по одному.

Включение перезаписи адресов

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

RewriteEngine On
RewriteBase /

Дальше идут условия и правила. Условие описывает, когда правило должно сработать, правило — что нужно сделать. Флаги в квадратных скобках уточняют поведение: L завершает обработку, R=301 делает постоянный редирект, NC игнорирует регистр, QSA сохраняет параметры запроса.

Постоянное перенаправление страниц

Самая частая задача — перенаправить старый адрес на новый. Для одной страницы достаточно простой директивы:

Redirect 301 /old-page.html /new-page/

Если нужно перенаправлять по шаблону, используйте перезапись:

RewriteRule ^blog/(.*)$ /articles/$1 [R=301,L]

Здесь всё, что находится в каталоге blog, уходит в каталог articles с сохранением остальной части адреса. Код 301 сообщает поисковикам, что перенос постоянный, и вес старой страницы передаётся новой.

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

Единый адрес сайта: зеркала и протокол

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

RewriteCond %{HTTP_HOST} ^www\.example\.com$ [NC]
RewriteRule ^(.*)$ https://example.com/$1 [R=301,L]

Принудительный переход на защищённый протокол:

RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]

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

Склейка слэша и приведение к единому виду

Адреса со слэшем и без считаются разными. Выберите один вариант и настройте перенаправление. Добавление слэша к адресам каталогов:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteRule ^(.*)$ /$1/ [R=301,L]

Условие с признаком файла нужно, чтобы не добавлять слэш к реальным файлам вроде изображений и стилей. Аналогично решается вопрос с «index.php» и «index.html» в конце адреса: главная страница должна быть доступна только по короткому адресу.

Красивые адреса (ЧПУ)

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

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?route=$1 [QSA,L]

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

Запрет доступа

Защита файлов и каталогов — вторая важная задача. Закрыть доступ к конкретному файлу:

<Files "config.php">
    Require all denied
</Files>

Запретить просмотр содержимого каталогов, где нет главной страницы:

Options -Indexes

Закрыть сразу набор служебных расширений:

<FilesMatch "\.(log|ini|bak|sql)$">
    Require all denied
</FilesMatch>

Ограничить доступ по адресу посетителя, например, разрешить административную часть только со своего адреса:

<Directory "/admin">
    Require ip 203.0.113.10
</Directory>

В зависимости от версии сервера синтаксис старых и новых директив различается. Если на вашем хостинге работает старый стиль, используйте пару Order и Deny, и не смешивайте оба стиля в одном файле.

Защита каталога паролем

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

AuthType Basic
AuthName "Closed area"
AuthUserFile /home/user/.htpasswd
Require valid-user

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

Блокировка нежелательных запросов

С помощью условий можно отсекать агрессивных ботов и подозрительные запросы:

RewriteCond %{HTTP_USER_AGENT} (badbot|scraper) [NC]
RewriteRule .* - [F,L]

Флаг F возвращает ошибку запрета. Применяйте такой приём аккуратно: заголовки легко подделать, а чрезмерно широкий шаблон способен заблокировать нормальных посетителей или полезных роботов. Для блокировки по адресу посетителей и подсетей лучше использовать правила запрета доступа.

Дополнительно можно защититься от встраивания ваших картинок на чужие сайты:

RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^https?://(www\.)?example\.com [NC]
RewriteRule \.(jpg|png|gif)$ - [F,NC,L]

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

.htaccess помогает ускорить сайт. Включение сжатия текстовых файлов:

<IfModule mod_deflate.c>
    AddOutputFilterByType DEFLATE text/html text/css application/javascript
</IfModule>

Указание браузеру кэшировать статические файлы:

<IfModule mod_expires.c>
    ExpiresActive On
    ExpiresByType image/png "access plus 1 month"
    ExpiresByType text/css "access plus 1 week"
</IfModule>

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

Пользовательские страницы ошибок

Чтобы посетитель увидел понятную страницу вместо сухого сообщения сервера, укажите свои обработчики:

ErrorDocument 404 /errors/404.html
ErrorDocument 403 /errors/403.html

Используйте локальный путь, а не полный адрес с протоколом: во втором случае сервер сделает перенаправление, и поисковики получат не ошибку, а успешный ответ, что нежелательно.

Рекомендации по безопасной работе

  1. Перед правкой сохраняйте копию файла и вносите изменения небольшими порциями.
  2. Комментируйте блоки строкой, начинающейся с решётки: через месяц вы не вспомните, зачем нужно правило.
  3. Проверяйте цепочки редиректов специальными инструментами, чтобы исключить петли.
  4. Закрывайте сам файл от просмотра извне — на большинстве серверов это делается по умолчанию, но проверьте.
  5. Не нагромождайте правила: если файл разросся, перенесите часть логики в конфигурацию сервера или в код приложения.
  6. После каждой правки тестируйте основные сценарии: главную, внутренние страницы, старые адреса, защищённые разделы.

Заключение

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

Действуйте методично, держите резервную копию под рукой, и файл станет надёжным помощником, а не источником неожиданных ошибок.

ПО
Павел Орлов
Автор SeoLiga.ru. Пишет о практике: что работает на реальных проектах, а что лучше обойти стороной. Хотите предложить свою статью? Загляните в раздел «Авторам».