English

Blog

RewriteRule

Categories: Web Development

RewriteRule является расширением модуля mod_rewrite используемого в htaccess. Директива RewriteRul описывает правило преобразования редиректов. Правил может быть написано несколько, при этом все они применяются по порядку написания. Если правила заканчиваются, они заново начинают применяться с начала, и цикл продолжается, пока выполняется хотя бы одно из правил. В некоторых ситуациях это может приводить к зацикливанию и ошибке, поэтому при описании нужно быть внимательным. Существует несколько флагов, которые дают возможность прервать зацикленный процесс на определенном правиле или пропустить правила (об этом рассказано ниже).

Синтаксис директивы RewriteRule выглядит следующим образом:

RewriteRule «исходный путь» «замена» «флаги»

Исходный путь

Исходный путь — это часть полной ссылки, путь до текущего каталога и параметры запроса, от которых отрезано имя сервера. Допустим, что ваш веб-сайт www.site.com расположен в каталоге /home/domains/www. Тогда для ссылки http://www.site.com/test/page.html?mode=0 исходным путем в каталоге /home/domains/www будет test/page.html, если выполняемый htaccess размешен в корне сайта. Если для раздела задан собственный htaccess в каталоге /home/domains/www/test — исходный путь будет — page.html. Исходный путь задается регулярным выражением. Можно поставить символ ! перед исходным путем, что будет означать правило выполниться по несовпадению ссылки с данным регулярным выражением.

Замена

Замена — это на что будет заменена исходная ссылка в случае выполнения правила RewriteRul. Замена может быть относительной (если не начинается с символа /) и абсолютной (если начинается с символа / или представляет полную ссылку, начинающуюся с http:// или https://). В замене можно использовать отмеченные части исходного пути, определенные круглыми скобками. Для этого используются макросы. Макрос $1 обозначает ту часть исходного пути, которая находится внутри первой пары скобок, $2 — внутри второй пары и так далее. Подробнее о макросах читайте в статье RewriteCond.

Флаги

Флаги — это не обязательные дополнительные опции данного правила, перечисляются в квадратных скобках и через запятую.

  • R (redirect)

    флаг останавливает процесс преобразования и вернет результат браузеру клиента как редирект (302, MOVED TEMPORARY). С флагом можно указать другой код результата, например «R=301″ возвратит 301 редирект (MOVED PERMANENTLY).

  • F (forbidden)

    вернет ошибку 403 (FORBIDDEN).

  • G (gone)

    вернет ошибку 410 (GONE).

  • P (proxy)

    — по этому флагу сервер Apache выполнит под запрос (sub-request) к странице с использованием программного mod_proxy модуля, при этом пользователь-клиент ничего не узнает об этом под запросе. Но если модуль mod_proxy не входит в состав вашей сборки сервера Apache, то применение флага вызовет ошибку.

  • L (last)

    останавливает процесс преобразования, и текущее выполнение ссылки считается окончательной.

  • N (next)

    запускает повторный процесс преобразования с первого по порядку правила.

  • C (chain)

    объединяет несколько правил RewriteRul в цепочку. Если первое правило цепочки «не выполнятся», то и вся цепочка игнорируется.

  • NS (nosubreq)

    разрешает «выполнение» правила только для настоящих запросов, игнорируя различные подзапросы.

  • NC (nocase)

    отключает проверку регистров символов.

  • QSA (qsappend)

    добавляет только исходные параметры запроса (query_string) к замене. Если замена не включает в себя новые параметры запроса, то исходные параметры запроса добавляются автоматически. Если же включает, без флага QSA исходные параметры запроса будут утеряны.

  • PT (passthrough)

    останавливает процесс преобразования и передает полученную ссылку дальше «по цепочке», чтобы с ней могли «поработать» директивы Redirect, Alias, ScriptAlias и другие (тогда как при флаге L(last) ссылка считается окончательной и не подлежит дальнейшей обработке).

  • S (skip)

    пропускает следующее правило, если данное правило «выполнилось». Можно пропустить несколько правил, при указать их количество, например: «S=2″.

  • E (env)

    устанавливает окружения для переменную, например: «E=переменная:значение».

RewriteRule примеры

RewriteRule htaccess 301 редирект

cо старой страницы на новую, в рамках одного домена и одной директории.

RewriteEngine on
RewriteRule ^oldpage\.html$ newpage.html [R=301]
Mod rewrite RewriteRule

301 редирект домена с www на не-www

RewriteEngine On
RewriteCond %{HTTP_HOST} ^www.site\.com$ [NC]
RewriteRule ^(.*)$ http://site.com/$1 [R=301,L]
RewriteRule на index php.

Если запрос не является файлом то редирект на обработчик, в данном случает index.php

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule (.*) index.php