Где лежит и как работает
Файл размещается в корне сайта и действует на него и все вложенные папки. Правила применяются сверху вниз при каждом запросе, поэтому порядок директив влияет на результат не меньше, чем их содержание.
Перед любыми правками сделайте копию файла. Синтаксическая ошибка в .htaccess приводит не к игнорированию строки, а к ошибке 500 на всём сайте.
1–3. Один основной адрес сайта
Первое, что нужно настроить, — чтобы сайт был доступен по одному адресу, а не по четырём.
RewriteEngine On
# 1. Только https
RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
# 2. Без www
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]
# 3. Убрать index.php из адреса
RewriteCond %{THE_REQUEST} /index\.php[\s?] [NC]
RewriteRule ^(.*)index\.php$ /$1 [R=301,L]
Порядок именно такой: сначала протокол, потом домен, потом путь. При обратной последовательности адрес без https и с www пройдёт через два перенаправления подряд.
4. Единый формат слэша
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteRule ^(.*)$ /$1/ [R=301,L]
Условие с !-f обязательно: без него сервер начнёт добавлять слэш к именам файлов, и на сайте пропадут изображения и стили. Выбор формата разобран в статье про слэш в конце URL.
5. Точечные перенаправления
# Одна страница
Redirect 301 /old-page.html /catalog/sadovye-kacheli/
# Раздел целиком с сохранением хвоста
RewriteRule ^katalog/(.*)$ /catalog/$1 [R=301,L]
Такие правила располагаются после общих: сначала сайт приводится к каноническому виду, потом обрабатываются частные случаи. Подробности — в инструкции по 301-редиректу.
6. Страница ошибки
ErrorDocument 404 /404.html
Обязательное условие: сама страница должна отдавать код 404, а не 200. Проверить это можно любым сервисом анализа заголовков ответа.
7–8. Безопасность и служебные файлы
# 7. Запретить просмотр содержимого папок
Options -Indexes
# 8. Закрыть доступ к служебным файлам
Require all denied
Открытый листинг папок показывает посетителю всё содержимое каталога, включая резервные копии и выгрузки. Директива отключает это поведение.
9. Сжатие
AddOutputFilterByType DEFLATE text/html text/plain text/css text/xml
AddOutputFilterByType DEFLATE application/javascript application/json
AddOutputFilterByType DEFLATE image/svg+xml
Сжатие уменьшает объём передаваемых текстовых файлов в несколько раз и напрямую влияет на скорость загрузки. Изображения в формате jpg и png сжимать повторно не нужно.
10. Кеш браузера
ExpiresActive On
ExpiresByType text/html "access plus 0 seconds"
ExpiresByType text/css "access plus 30 days"
ExpiresByType application/javascript "access plus 30 days"
ExpiresByType image/jpeg "access plus 60 days"
ExpiresByType image/svg+xml "access plus 60 days"
Html-страницы кешировать нельзя: посетитель будет видеть устаревшее содержимое. Стили, скрипты и картинки — можно и нужно.
11. Заголовки безопасности
Header set X-Content-Type-Options "nosniff"
Header set Referrer-Policy "strict-origin-when-cross-origin"
Header set X-Frame-Options "SAMEORIGIN"
Три строки закрывают базовые вопросы: запрет угадывания типа файла, контроль передачи адреса-источника и защита от встраивания сайта в чужой фрейм.
12. Кодировка по умолчанию
AddDefaultCharset UTF-8
Строка избавляет от «кракозябр» на страницах, где кодировка не указана явно.
Проверка после правок. Откройте сайт сразу после сохранения файла. Ошибка 500 означает синтаксическую проблему: верните копию и вносите правила по одному, проверяя после каждого.
Итоговый порядок правил
- Включение движка переписывания и кодировка.
- Переход на https.
- Склейка www.
- Удаление index.php.
- Формат слэша.
- Точечные редиректы.
- Страница ошибки, сжатие, кеш, заголовки.
После настройки проверьте, что ни один адрес не проходит через два перенаправления подряд: цепочки замедляют обход сайта и размывают сигналы страниц.
Как проверять правила
После каждой правки нужен способ убедиться, что правило сработало и не сломало соседние. Минимальный набор проверок:
| Что открыть | Ожидание |
|---|---|
| Главная по http | 301 на https |
| Главная с www | 301 на версию без www |
| Внутренняя страница | 200 |
| Та же страница в другом формате слэша | 301 |
| Картинка из папки загрузок | 200, без редиректов |
| Несуществующий адрес | 404 и своя страница ошибки |
Пятая строка — самая важная: неаккуратное правило слэша ломает отдачу файлов, и сайт остаётся без картинок и стилей.
Чего в .htaccess делать не стоит
- Держать сотни точечных редиректов. Файл читается при каждом запросе, и длинный список замедляет сайт. Переносите массовые перенаправления на уровень приложения.
- Закрывать разделы от индексации. Для этого есть robots.txt и метатеги, а не правила сервера.
- Экспериментировать на рабочем сайте. Ошибка даёт не предупреждение, а полную недоступность.
- Копировать чужие сборки целиком. В интернете гуляют файлы на двести строк, половина которых относится к другой версии Apache.
Правило простое: каждая строка в файле должна быть понятна тому, кто её добавил, и решать конкретную задачу этого сайта.
Частые вопросы
Почему после правки .htaccess сайт отдаёт ошибку 500?
Это синтаксическая ошибка в файле. Верните резервную копию и добавляйте правила по одному, проверяя сайт после каждого изменения.
Работает ли .htaccess на nginx?
Нет, это файл конфигурации Apache. На nginx те же задачи решаются директивами в конфигурации сервера, которые обычно правит администратор хостинга.
В каком порядке размещать правила?
Сначала общие: протокол, домен, индексный файл, слэш. Потом точечные редиректы. Иначе адреса будут проходить через цепочки перенаправлений.
Готовый адрес можно собрать прямо сейчас: откройте генератор ЧПУ — он транслитерирует фразу по таблице Яндекса, уберёт служебные слова и покажет длину адреса.