| Директива RewriteRule
Description: | Defines rules for the rewriting engine |
Syntax: | RewriteRule
Pattern Substitution [flags] |
Context: | server config, virtual host, directory, .htaccess |
Override: | FileInfo |
Status: | Extension |
Module: | mod_rewrite |
Директива RewriteRule — настоящая рабочая лошадка по переписыванию. Директива может встречаться более одного раза, при этом каждый экземпляр определяет одно правило перезаписи. Порядок, в котором определены эти правила, важен — это порядок, в котором они будут применяться во время выполнения.
Шаблон представляет собой Perl-совместимое регулярное выражение . То, с чем сравнивается этот шаблон, зависит от того, где RewriteRule определена директива.
В VirtualHost контексте шаблон изначально будет сопоставляться с частью URL-адреса после имени хоста и порта и перед строкой запроса (например, «/app1/index.html»). Это (%-decoded) URL-путь.
В контексте каталога ( Directory и .htaccess) шаблон сопоставляется только с частичным путем, например, запрос «/app1/index.html» может привести к сравнению с «app1/index.html» или «index. html" в зависимости от того, где он RewriteRule определен.
Путь к каталогу, в котором определено правило, удаляется из текущего сопоставленного пути файловой системы перед сравнением (до косой черты в конце включительно). Конечным результатом этого удаления префикса для каждого каталога является то, что правила в этом контексте совпадают только с частью текущего сопоставленного пути файловой системы «ниже», где определено правило.
Директивы, такие как DocumentRoot и Alias , или даже результат предыдущих RewriteRule замен, определяют текущий отображаемый путь файловой системы.
Если вы хотите сопоставить имя хоста, порт или строку запроса, используйте a
RewriteCond с
переменными %{HTTP_HOST} , %{SERVER_PORT} или
%{QUERY_STRING} соответственно.
Перезапись каталогов
- Механизм перезаписи может использоваться в файлах .htaccess и в
<Directory> разделах с некоторыми дополнительными сложностями.
- Чтобы включить механизм перезаписи в этом контексте, вам необходимо установить "
RewriteEngine On " и
" Options FollowSymLinks " должны быть включены. Если ваш администратор отключил переопределение FollowSymLinks для пользовательского каталога, вы не сможете использовать механизм перезаписи. Это ограничение необходимо из соображений безопасности.
- См.
RewriteBase
директиву для получения дополнительной информации о том, какой префикс будет добавлен обратно к относительным заменам.
- Если вы хотите сопоставить полный URL-путь в RewriteRule для каждого каталога (htaccess), используйте переменную
%{REQUEST_URI} в файле RewriteCond .
- Удаленный префикс всегда заканчивается косой чертой, что означает, что сопоставление происходит со строкой, в которой
никогда не было ведущей косой черты. Следовательно, шаблон с
^/ никогда не совпадает в контексте каталога.
- Хотя правила перезаписи синтаксически разрешены в разделах
<Location> и <Files> (включая их аналоги регулярных выражений), это никогда не должно быть необходимым и не поддерживается. Вероятной особенностью, которая может сломаться в этих контекстах, являются относительные замены.
Некоторые советы по регулярным выражениям см. во Введении к mod_rewrite.
В mod_rewrite символ НЕ (' ! ') также доступен в качестве возможного префикса шаблона. Это позволяет вам отрицать шаблон; сказать, например: « если текущий URL-адрес НЕ соответствует этому шаблону ». Это можно использовать в исключительных случаях, когда проще сопоставить отрицательный шаблон, или как последнее правило по умолчанию.
Примечание
При использовании символа NOT для отрицания шаблона вы не можете включать в этот шаблон сгруппированные части с подстановочными знаками. Это связано с тем, что, когда шаблон НЕ соответствует (т. е. совпадение отрицания), для групп нет содержимого. Таким образом, если используются инвертированные шаблоны, вы не можете использовать $N в строке подстановки!
Подстановка правила перезаписи — это строка, которая заменяет исходный URL -путь, совпавший с Pattern . Замена может быть :
- путь файловой системы
- Указывает расположение в файловой системе ресурса, который должен быть доставлен клиенту. Замены рассматриваются как путь в файловой системе, только если правило настроено в контексте сервера (виртуального хоста) и первый компонент пути в замене существует в файловой системе.
- URL-путь
- Относительный
DocumentRoot путь к обслуживаемому ресурсу. Обратите внимание, что он mod_rewrite
пытается угадать, указали ли вы путь к файловой системе или URL-путь, проверяя, существует ли первый сегмент пути в корне файловой системы. Например, если вы укажете строку
подстановки /www/file.html , то она будет рассматриваться как URL-путь, если каталог с таким именем www
не существует в корне или в вашей файловой системе (или, в случае использования перезаписей в файле .htaccess , относительно вашей root документа), и в этом случае он будет рассматриваться как путь файловой системы. Alias Если вы хотите , чтобы к результирующему URL-пути применялись другие директивы сопоставления URL-адресов (например, ), используйте [PT] флаг, как описано ниже.
- Абсолютный URL
- Если указан абсолютный URL-адрес,
mod_rewrite проверяет, соответствует ли имя хоста текущему хосту. Если это так, схема и имя хоста удаляются, а результирующий путь рассматривается как URL-путь. В противном случае для данного URL выполняется внешнее перенаправление. Чтобы принудительно выполнить внешнее перенаправление обратно на текущий хост, см. [R] флаг ниже.
-
- (бросаться)
- Прочерк указывает на то, что подстановку производить не следует (существующий путь передается нетронутым). Это используется, когда необходимо применить флаг (см. ниже) без изменения пути.
В дополнение к простому тексту строка замены может включать
- обратные ссылки (
$N ) на шаблон RewriteRule
- обратные ссылки (
%N ) на последний совпавший шаблон RewriteCond
- серверные переменные, как в тестовых строках условия правила (
%{VARNAME} )
- вызовы функции сопоставления (
${mapname:key|default} )
Обратные ссылки — это идентификаторы вида
$ N
( N =0..9), которые будут заменены содержимым N- й группы совпавшего Pattern . Серверные переменные такие же, как и для TestString директивы
RewriteCond
. Функции отображения взяты из
RewriteMap
директивы и объясняются там. Эти три типа переменных раскрываются в указанном выше порядке.
Правила перезаписи применяются к результатам предыдущих правил перезаписи в том порядке, в котором они определены в файле конфигурации. URL-путь или путь к файловой системе (см. «Что совпадает?», Выше) полностью заменяется заменой , и процесс перезаписи продолжается до тех пор, пока не будут применены все правила, или он явно не завершается флагом
L или другим флагом. что подразумевает немедленное завершение, например
END или
F .
Изменение строки запроса
По умолчанию строка запроса передается без изменений. Однако вы можете создавать URL-адреса в строке подстановки, содержащей часть строки запроса. Просто используйте вопросительный знак внутри строки подстановки, чтобы указать, что следующий текст должен быть повторно введен в строку запроса. Если вы хотите стереть существующую строку запроса, завершите строку подстановки только вопросительным знаком. Чтобы объединить новые и старые строки запроса, используйте
[QSA] флаг.
Кроме того, вы можете установить специальные действия, которые будут выполняться, добавив флаги
в качестве третьего аргумента директивы
. Флаги — это разделенный запятыми список, заключенный в квадратные скобки, любого из флагов в следующей таблице. Дополнительные сведения и примеры для каждого флага доступны в документе Rewrite Flags. [ ] RewriteRule
B |
Экранируйте небуквенно-цифровые символы в обратных ссылках перед
применением преобразования. подробности ... |
backrefnoplus|BNP |
Если обратные ссылки экранируются, пробелы следует экранировать до %20 вместо +. Полезно, когда обратная ссылка будет использоваться в компоненте пути, а не в строке запроса. подробности ... |
chain|C |
Правило связано со следующим правилом. Если правило не выполняется, связанные с ним правила будут пропущены. подробности ... |
cookie|CO=NAME:VAL |
Устанавливает куки в клиентском браузере. Полный синтаксис: CO= NAME : VAL : домен [: время жизни [: путь [: безопасный ] [: только http ]]]] подробности ...
|
discardpath|DPI |
Приводит к отбрасыванию части PATH_INFO переписанного URI. подробности ... |
END |
Немедленно остановите процесс перезаписи и не применяйте больше никаких правил. Также предотвращает дальнейшее выполнение правил перезаписи для каждого каталога и контекста .htaccess. (Доступно в версии 2.3.9 и выше)
подробности... |
env|E=[!]VAR[:VAL] |
Приводит к установке переменной среды VAR (в значение VAL , если указано). Форма ! VAR приводит к сбросу
переменной среды VAR . подробности ... |
forbidden|F |
Возвращает ответ 403 FORBIDDEN браузеру клиента.
подробности ... |
gone|G |
Возвращает ответ 410 GONE браузеру клиента. подробности ... |
Handler|H=Content-handler |
Вызывает отправку результирующего URI указанному
обработчику содержимого для обработки. подробности ... |
last|L |
Немедленно остановите процесс перезаписи и не применяйте больше никаких правил. Особо обратите внимание на предостережения для каждого каталога и контекста .htaccess (см. также флаг END). подробности ... |
next|N |
Повторно запустите процесс перезаписи, начиная снова с первого правила, используя результат набора правил в качестве отправной точки. подробности ... |
nocase|NC |
Делает сравнение шаблонов нечувствительным к регистру.
подробности ... |
noescape|NE |
Запрещает mod_rewrite применять экранирование специальных символов в шестнадцатеричном коде в результате перезаписи. подробности ... |
nosubreq|NS |
Приводит к пропуску правила, если текущий запрос является внутренним подзапросом. подробности ... |
proxy|P |
Принудительная внутренняя отправка URL-адреса подстановки в качестве прокси-запроса. подробности ... |
passthrough|PT |
Принудительно передает результирующий URI обратно в механизм сопоставления URL-адресов для обработки других преобразователей URI в имена файлов, таких как Alias или
Redirect . подробности ... |
qsappend|QSA |
Добавляет любую строку запроса из исходного URL-адреса запроса к любой строке запроса, созданной в цели перезаписи. подробности ... |
qsdiscard|QSD |
Отменить любую строку запроса, прикрепленную к входящему URI.
подробности ... |
qslast|QSL |
Интерпретируйте последний (самый правый) вопросительный знак как разделитель строки запроса, а не первый (самый левый), как обычно. Доступно в версии 2.4.19 и выше.
подробности ... |
redirect|R[=code] |
Вызывает внешнее перенаправление, возможно, с указанным кодом состояния HTTP. подробности ...
|
skip|S=num |
Сообщает механизму перезаписи пропустить следующее число
правил, если текущее правило совпадает. подробности ... |
type|T=MIME-type |
Заставьте MIME-тип целевого файла быть указанным типом. подробности ... |
Расширение домашнего каталога
Когда строка подстановки начинается со строки, похожей на «/~user» (через явный текст или обратные ссылки), mod_rewrite выполняет расширение домашнего каталога независимо от наличия или конфигурации файла mod_userdir .
Это расширение не происходит, когда
в директиве используется флаг PT RewriteRule
.
Вот все возможные комбинации замен и их значения:
Внутри конфигурации для каждого сервера ( apache2.conf )
для запроса GET
/somepath/pathinfo :
^/somepath(.*) другой путь$1 |
недействительный, не поддерживается |
^/somepath(.*) otherpath$1 [R] |
недействительный, не поддерживается |
^/somepath(.*) otherpath$1 [P] |
недействительный, не поддерживается |
^/somepath(.*) /otherpath$1 |
/другой путь/информация о пути |
^/somepath(.*) /otherpath$1 [R] |
http://thishost/otherpath/pathinfo через внешнее перенаправление |
^/somepath(.*) /otherpath$1 [P] |
не имеет смысла, не поддерживается |
^/somepath(.*) http://thishost/otherpath$1 |
/другой путь/информация о пути |
^/somepath(.*) http://thishost/otherpath$1 [R] |
http://thishost/otherpath/pathinfo через внешнее перенаправление |
^/somepath(.*) http://thishost/otherpath$1 [P] |
не имеет смысла, не поддерживается |
^/somepath(.*) http://otherhost/otherpath$1 |
http://otherhost/otherpath/pathinfo через внешнее перенаправление |
^/somepath(.*) http://otherhost/otherpath$1 [R] |
http://otherhost/otherpath/pathinfo через внешнее перенаправление (флаг [R] избыточен) |
^/somepath(.*) http://otherhost/otherpath$1 [P] |
http://otherhost/otherpath/pathinfo через внутренний прокси |
Внутренняя конфигурация каждого каталога для
/somepath
( /physical/path/to/somepath/.htaccess , with
RewriteBase "/somepath" )
для запроса `` GET
/somepath/localpath/pathinfo '':
^localpath(.*) другой путь$1 |
/somepath/otherpath/pathinfo |
^localpath(.*) другой путь$1 [R] |
http://thishost/somepath/otherpath/pathinfo через внешнее перенаправление |
^localpath(.*) другой путь$1 [P] |
не имеет смысла, не поддерживается |
^локальный путь(.*) /другой путь$1 |
/другой путь/информация о пути |
^localpath(.*) /otherpath$1 [R] |
http://thishost/otherpath/pathinfo через внешнее перенаправление |
^localpath(.*) /otherpath$1 [P] |
не имеет смысла, не поддерживается |
^localpath(.*) http://thishost/otherpath$1 |
/другой путь/информация о пути |
^localpath(.*) http://thishost/otherpath$1 [R] |
http://thishost/otherpath/pathinfo через внешнее перенаправление |
^localpath(.*) http://thishost/otherpath$1 [P] |
не имеет смысла, не поддерживается |
^localpath(.*) http://otherhost/otherpath$1 |
http://otherhost/otherpath/pathinfo через внешнее перенаправление |
^localpath(.*) http://otherhost/otherpath$1 [R] |
http://otherhost/otherpath/pathinfo через внешнее перенаправление (флаг [R] избыточен) |
^localpath(.*) http://otherhost/otherpath$1 [P] |
http://otherhost/otherpath/pathinfo через внутренний прокси |
|
![Навигатор по сайту](http://nskhuman.ru/knopkamenu.png) |