Файл .htaccess — главный инструмент настройки редиректов на серверах Apache. С его помощью можно настроить переадресацию без изменения конфигурации сервера и без помощи хостинг-провайдера.
Что такое .htaccess
.htaccess (hypertext access) — конфигурационный файл веб-сервера Apache. Он позволяет управлять настройками директории, в которой находится, включая:
- Настройку редиректов (301, 302)
- Управление доступом
- Переопределение URL (ЧПУ)
- Настройку кэширования
- Обработку ошибок
Важно: файл .htaccess работает только на серверах Apache. Для Nginx используйте конфигурацию сервера.
Базовые редиректы с директивой Redirect
Самый простой способ настроить редирект — использовать директиву Redirect.
Редирект одной страницы
# 301 редирект (постоянный)
Redirect 301 /old-page.html https://example.ru/new-page.html
# 302 редирект (временный)
Redirect 302 /promo https://example.ru/sale
Редирект всего сайта на новый домен
Redirect 301 / https://newdomain.ru/
Ограничение: директива Redirect не сохраняет путь. Все страницы будут вести на главную нового домена.
Редиректы с mod_rewrite
Для сложных правил используйте модуль mod_rewrite. Он поддерживает регулярные выражения и условия.
Включение mod_rewrite
# Всегда добавляйте в начало файла
RewriteEngine On
Редирект домена с сохранением путей
RewriteEngine On
RewriteCond %{HTTP_HOST} ^old-domain\.ru$ [NC]
RewriteRule ^(.*)$ https://new-domain.ru/$1 [R=301,L]
Разбор:
RewriteCond— условие: если домен = old-domain.ru^(.*)$— захватываем весь путь$1— подставляем захваченный путь[R=301,L]— код 301, последнее правило
Редирект с HTTP на HTTPS
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
Редирект с www на без www
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]
Редирект без www на www
RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L]
Комбинированный редирект: HTTP + www → HTTPS без www
RewriteEngine On
# Сначала редирект на HTTPS
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
# Затем убираем www
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]
Частые сценарии редиректов
Удаление расширения .html из URL
RewriteEngine On
# Убираем .html из URL
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.html -f
RewriteRule ^(.*)$ $1.html [L]
# Редирект с .html на чистый URL
RewriteCond %{THE_REQUEST} /([^.]+)\.html [NC]
RewriteRule ^ /%1 [R=301,L]
Редирект с trailing slash (/)
# Добавить / в конец URL
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !/$
RewriteRule ^(.*)$ $1/ [R=301,L]
# Убрать / из конца URL
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} /$
RewriteRule ^(.+)/$ $1 [R=301,L]
Массовый редирект страниц
# Редирект категории
RewriteRule ^blog/(.*)$ /articles/$1 [R=301,L]
# Редирект с параметрами
RewriteCond %{QUERY_STRING} ^id=([0-9]+)$
RewriteRule ^product\.php$ /product/%1? [R=301,L]
Редирект по языку/региону
RewriteCond %{HTTP:Accept-Language} ^ru [NC]
RewriteRule ^$ /ru/ [R=302,L]
RewriteCond %{HTTP:Accept-Language} ^en [NC]
RewriteRule ^$ /en/ [R=302,L]
Флаги RewriteRule
| Флаг | Значение | Описание |
|---|---|---|
[R=301] | Redirect | Выполнить редирект с кодом 301 |
[R=302] | Redirect | Выполнить редирект с кодом 302 |
[L] | Last | Последнее правило, прекратить обработку |
[NC] | No Case | Без учёта регистра |
[QSA] | Query String Append | Добавить query string к новому URL |
[NE] | No Escape | Не экранировать спецсимволы |
Условия RewriteCond
| Переменная | Описание |
|---|---|
%{HTTP_HOST} | Имя домена |
%{REQUEST_URI} | Путь запроса |
%{QUERY_STRING} | Параметры запроса |
%{HTTPS} | on/off — протокол |
%{REQUEST_FILENAME} | Полный путь к файлу |
%{THE_REQUEST} | Полная строка запроса |
Типичные ошибки
1. Бесконечный цикл редиректов
Проблема: страница редиректит сама на себя.
# НЕПРАВИЛЬНО — создаст цикл
RewriteRule ^(.*)$ https://example.ru/$1 [R=301,L]
Решение: добавьте условие.
# ПРАВИЛЬНО
RewriteCond %{HTTP_HOST} !^example\.ru$ [NC]
RewriteRule ^(.*)$ https://example.ru/$1 [R=301,L]
2. Не работает mod_rewrite
Убедитесь, что модуль включён и разрешён:
# В конфигурации Apache (httpd.conf)
LoadModule rewrite_module modules/mod_rewrite.so
<Directory /var/www/html>
AllowOverride All
</Directory>
3. Порядок правил имеет значение
Правила применяются сверху вниз. Более специфичные правила ставьте выше общих.
# Сначала конкретные страницы
Redirect 301 /special-page /new-special-page
# Потом общие правила
RewriteRule ^blog/(.*)$ /articles/$1 [R=301,L]
Проверка редиректов
После настройки обязательно проверьте работу редиректов:
- В браузере: откройте старый URL и убедитесь, что происходит редирект
- curl в терминале:
curl -I https://example.ru/old-page
- Онлайн: используйте наш тестер редиректов
Альтернатива: редиректо.ru
Настройка .htaccess требует технических знаний и доступа к серверу. С редиректо.ru вы можете:
- Настроить редирект в 2 клика без кода
- Автоматически получить SSL сертификат
- Включить Path Forwarding одной галочкой
- Отслеживать статистику переходов