mod_rewrite — модуль Apache для перезаписи URL и редиректов на основе регулярных выражений. Превращает технические адреса вроде /index.php?id=123 в читаемые /product/123 — незаметно для пользователя и поисковых роботов.
Как работает mod_rewrite
При получении HTTP-запроса Apache проверяет правила mod_rewrite поочерёдно. Каждое правило состоит из трёх частей: необязательного условия (RewriteCond), паттерна (регулярное выражение) и действия — подстановки или редиректа. Если паттерн совпадает с URI запроса — выполняется подстановка.
Правила работают в двух контекстах: .htaccess — на уровне директории, основной конфиг сервера — глобально. В .htaccess необходима директива AllowOverride All в конфигурации виртуального хоста.
Ключевые директивы
RewriteEngine On— активирует модуль перезаписи.RewriteBase /— базовый путь для относительных подстановок.RewriteCond %{переменная} паттерн [флаги]— условие: проверяет переменные окружения, заголовки запроса.RewriteRule паттерн подстановка [флаги]— само правило перезаписи.
Практические примеры
Редирект HTTP → HTTPS:
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Чистые URL для WordPress:
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
Флаги
- [L]
- Last — последнее правило, прекратить обработку.
- [R=301]
- Redirect — выполнить перенаправление с кодом 301.
- [NC]
- NoCase — без учёта регистра.
- [QSA]
- QueryStringAppend — добавить строку запроса к подстановке.
- [PT]
- PassThrough — передать результат следующему обработчику.
История
mod_rewrite написан Рольфом Энгельхардтом (Ralf S. Engelschall) в 1996 году для Apache 1.2. Включён в стандартную поставку Apache с версии 1.3. Автор сравнивал документацию к своему модулю с «Полным руководством по ядерной физике» — синтаксис регулярных выражений и флаги поначалу контринтуитивны.
На что обращать внимание
Apache читает .htaccess при каждом запросе — это замедляет сервер. На VPS переносите правила mod_rewrite в основной конфиг и отключайте AllowOverride. Аналог в Nginx — директивы rewrite и location с регулярными выражениями: Nginx в 5–10 раз быстрее обрабатывает статику без .htaccess. Для отладки используйте RewriteLog (Apache 2.2) или LogLevel rewrite:trace3 (Apache 2.4).
Типичные задачи
Принудительный www:
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
Запрет прямого доступа к файлам (защита wp-config.php в WordPress):
RewriteRule ^wp-config\.php - [F,L]
Семантические URL для CMS — без расширения .php:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([a-z0-9-]+)$ /page.php?slug=$1 [L,QSA]
На Nginx аналогичные задачи решаются директивами rewrite и try_files без сторонних модулей. Производительность выше за счёт отсутствия .htaccess.