Файл .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
Используйте локальный путь, а не полный адрес с протоколом: во втором случае сервер сделает перенаправление, и поисковики получат не ошибку, а успешный ответ, что нежелательно.
Рекомендации по безопасной работе
- Перед правкой сохраняйте копию файла и вносите изменения небольшими порциями.
- Комментируйте блоки строкой, начинающейся с решётки: через месяц вы не вспомните, зачем нужно правило.
- Проверяйте цепочки редиректов специальными инструментами, чтобы исключить петли.
- Закрывайте сам файл от просмотра извне — на большинстве серверов это делается по умолчанию, но проверьте.
- Не нагромождайте правила: если файл разросся, перенесите часть логики в конфигурацию сервера или в код приложения.
- После каждой правки тестируйте основные сценарии: главную, внутренние страницы, старые адреса, защищённые разделы.
Заключение
.htaccess — мощный и при этом простой инструмент. С его помощью вы настроите постоянные перенаправления, единое зеркало, читаемые адреса, защиту служебных файлов и закрытых разделов, а также ускорите отдачу страниц. Важно помнить о порядке правил, о совместимости директив с вашим сервером и о том, что каждая правка требует проверки.
Действуйте методично, держите резервную копию под рукой, и файл станет надёжным помощником, а не источником неожиданных ошибок.