Руководство по настройке редиректов в Apache
Содержание
Перенаправления в Apache настраиваются преимущественно через файлы .htaccess и модуль mod_rewrite. Это особенно полезно на виртуальном хостинге, где нет доступа к основной конфигурации сервера.
Основы .htaccess
.htaccess — это файл конфигурации Apache для отдельных каталогов. Поместите его в корень вашего сайта, и Apache прочитает его автоматически. Имя файла начинается с точки — это скрытый файл в Unix-системах.
Включение mod_rewrite
# Ubuntu/Debian
sudo a2enmod rewrite
sudo systemctl restart apache2
# CentOS/RHEL — раскомментируйте в /etc/httpd/conf/httpd.conf:
LoadModule rewrite_module modules/mod_rewrite.so
Разрешение переопределений .htaccess
<Directory /var/www/html>
AllowOverride All
</Directory>
Директива Redirect
Самый простой подход — без регулярных выражений:
# 301 постоянный
Redirect 301 /old-page.html https://example.com/new-page.html
# 302 временный
Redirect 302 /sale https://example.com/promo
# Перенаправление всего сайта на новый домен
Redirect 301 / https://new-domain.com/
💡 Ограничения Redirect
Директива Redirect проста, но не поддерживает регулярные выражения и условную логику. Используйте RewriteRule для более сложных случаев.
RewriteRule
RewriteEngine On
# HTTP → HTTPS
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
# без www → www
RewriteCond %{HTTP_HOST} ^example\.com$ [NC]
RewriteRule ^(.*)$ https://www.example.com/$1 [R=301,L]
Основные флаги
[R=301]— 301 постоянный редирект[R=302]— 302 временный редирект[L]— Последнее правило, прекратить обработку[NC]— Без учёта регистра[QSA]— Добавить исходную строку запроса
RewriteCond
Условия, которые должны быть истинными перед выполнением следующего RewriteRule:
# Перенаправление мобильных пользователей
RewriteCond %{HTTP_USER_AGENT} "android|iphone|ipad" [NC]
RewriteRule ^(.*)$ https://m.example.com/$1 [R=302,L]
# Перенаправление на основе строки запроса
RewriteCond %{QUERY_STRING} ^id=([0-9]+)$
RewriteRule ^article$ /post/%1? [R=301,L]
Типичные сценарии
Принудительный HTTPS + www
RewriteEngine On
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^example\.com$ [NC]
RewriteRule ^(.*)$ https://www.example.com/$1 [R=301,L]
Удаление расширения .html
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.html -f
RewriteRule ^(.+)$ $1.html [L]
RewriteCond %{THE_REQUEST} ^[A-Z]+\ /(.+)\.html
RewriteRule ^ /%1 [R=301,L]
Постоянные ссылки WordPress
# BEGIN WordPress
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
# END WordPress
Типичные ошибки
500 Internal Server Error
Почти всегда — синтаксическая ошибка в .htaccess. Проверьте журнал ошибок Apache:
tail -f /var/log/apache2/error.log
Петля перенаправлений
# ❌ Цикл — нет условия для остановки повторного срабатывания
RewriteRule ^(.*)$ https://example.com/ [R=301,L]
# ✅ Добавьте условие HTTPS
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://example.com/ [R=301,L]
Потеря строки запроса
# ❌ Строка запроса потеряна
RewriteRule ^old-page$ /new-page [R=301,L]
# ✅ Сохранение с флагом QSA
RewriteRule ^old-page$ /new-page [R=301,L,QSA]
Отладка
# Включение журнала перезаписи (Apache 2.4)
LogLevel alert rewrite:trace3
# Тестирование с curl
curl -I http://example.com/old-page
curl -IL http://example.com/old-page
Или используйте 301check.com для визуализации полной цепочки перенаправлений.