hostprofi.ru
Подобрать хостинг
Термин

mod_rewrite

краткое определение

mod_rewrite — модуль Apache для перезаписи URL на основе регулярных выражений. Используется для чистых URL, 301-редиректов HTTPS и маршрутизации запросов в CMS.

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.

Другие термины