Модуль Apache mod_rewrite
| Описание: | Предоставляет механизм переписывания на основе правил для преобразования запрошенных URL на лету |
|---|---|
| Статус: | Расширение |
| Идентификатор модуля: | rewrite_module |
| Исходный файл: | mod_rewrite.c |
Краткое описание
Модуль mod_rewrite использует механизм переписывания на основе правил, основанный на анализаторе регулярных выражений PCRE, для преобразования запрошенных URL на лету. По умолчанию mod_rewrite сопоставляет URL с путём в файловой системе. Однако его также можно использовать для перенаправления с одного URL на другой или для выполнения внутреннего прокси-запроса.
mod_rewrite предоставляет гибкий и мощный способ управления URL с помощью неограниченного числа правил. К каждому правилу можно прикрепить неограниченное количество условий, что позволяет переписывать URL на основе переменных сервера, переменных среды, HTTP-заголовков или временных меток.
mod_rewrite работает с полным путём URL, включая секцию path-info. Правило переписывания можно вызвать в httpd.conf или в .htaccess. Путь, созданный правилом переписывания, может включать строку запроса или привести к внутренней дополнительной обработке, внешнему перенаправлению запроса либо внутренней передаче прокси.
Дополнительные сведения, обсуждение и примеры приведены в подробной документации по mod_rewrite.
Ведение журнала
mod_rewrite обеспечивает подробное журналирование своих действий на уровнях журнала от trace1 до trace8. Уровень журнала для mod_rewrite можно задать отдельно с помощью директивы LogLevel: при уровне до debug действия не журналируются, а trace8 означает, что журналируются практически все действия.
mod_rewrite значительно замедлит работу Apache HTTP Server! Используйте уровень журнала выше trace2 только для отладки! Пример
LogLevel alert rewrite:trace3
RewriteLog
Те, кто знаком с предыдущими версиями mod_rewrite, наверняка ищут директивы RewriteLog и RewriteLogLevel. Эта функциональность была полностью заменена упомянутой выше новой конфигурацией журналирования для отдельных модулей.
Чтобы получить только сообщения журнала, относящиеся к mod_rewrite, передайте файл журнала команде grep:
tail -f error_log|fgrep '[rewrite:'
Директива RewriteBase
| Описание: | Задаёт базовый URL для переписывания в контексте каталога |
|---|---|
| Синтаксис: | RewriteBase URL-path |
| Значение по умолчанию: | None |
| Контекст: | каталог, .htaccess |
| Переопределение: | FileInfo |
| Статус: | Расширение |
| Модуль: | mod_rewrite |
Директива RewriteBase задаёт префикс URL, используемый директивами RewriteRule в контексте отдельного каталога (htaccess), которые подставляют относительный путь.
Эта директива обязательна, если в подстановке в контексте отдельного каталога (htaccess) используется относительный путь, за исключением случаев, когда выполняется одно из следующих условий:
- Исходный запрос и подстановка находятся внутри
DocumentRoot(а не доступны иными способами, например черезAlias). - Путь в файловой системе к каталогу, содержащему
RewriteRule, с добавленной в конец относительной подстановкой также является допустимым путём URL на сервере (это встречается редко). - В Apache HTTP Server 2.4.16 и более поздних версиях эту директиву можно опустить, если запрос сопоставляется посредством
Aliasилиmod_userdir.
В приведённом ниже примере RewriteBase необходима, чтобы избежать переписывания в http://example.com/opt/myapp-1.2.3/welcome.html, поскольку ресурс не был относительным к корню документов. Такая ошибка конфигурации обычно заставляет сервер искать каталог «opt» внутри корня документов.
DocumentRoot "/var/www/example.com"
AliasMatch "^/myapp" "/opt/myapp-1.2.3"
<Directory "/opt/myapp-1.2.3">
RewriteEngine On
RewriteBase "/myapp/"
RewriteRule "^index\.html$" "welcome.html"
</Directory> Директива RewriteCond
| Описание: | Определяет условие, при выполнении которого будет происходить переписывание |
|---|---|
| Синтаксис: | RewriteCond TestString CondPattern [flags] |
| Контекст: | конфигурация сервера, виртуальный хост, каталог, .htaccess |
| Переопределение: | FileInfo |
| Статус: | Расширение |
| Модуль: | mod_rewrite |
Директива RewriteCond задаёт условие правила. Перед директивой RewriteRule может располагаться одна или несколько директив RewriteCond. Следующее правило используется только в том случае, если текущее состояние URI соответствует шаблону и выполняются эти условия.
TestString — это строка, которая помимо обычного текста может содержать следующие раскрываемые конструкции:
- Обратные ссылки RewriteRule: это обратные ссылки вида
$N(0 <= N <= 9). Ссылки $1–$9 предоставляют доступ к сгруппированным частям (в скобках) шаблона изRewriteRule, к которому применяется текущий набор условийRewriteCond. Ссылка $0 предоставляет доступ ко всей строке, совпавшей с этим шаблоном. - Обратные ссылки RewriteCond: это обратные ссылки вида
%N(0 <= N <= 9). Ссылки %1–%9 предоставляют доступ к сгруппированным частям (также заключённым в скобки) шаблона из последней совпавшейRewriteCondв текущем наборе условий. Ссылка %0 предоставляет доступ ко всей строке, совпавшей с этим шаблоном. - Подстановки RewriteMap: это подстановки вида
${mapname:key|default}. Подробности см. в документации по RewriteMap. - Переменные сервера: это переменные вида
%{NAME_OF_VARIABLE}, где NAME_OF_VARIABLE может быть строкой из следующего списка:HTTP-заголовки: соединение и запрос: HTTP_ACCEPT
HTTP_COOKIE
HTTP_FORWARDED
HTTP_HOST
HTTP_PROXY_CONNECTION
HTTP_REFERER
HTTP_USER_AGENT
AUTH_TYPE
CONN_REMOTE_ADDR
CONTEXT_PREFIX
CONTEXT_DOCUMENT_ROOT
IPV6
PATH_INFO
QUERY_STRING
REMOTE_ADDR
REMOTE_HOST
REMOTE_IDENT
REMOTE_PORT
REMOTE_USER
REQUEST_METHOD
SCRIPT_FILENAME
внутренние переменные сервера: дата и время: специальные: DOCUMENT_ROOT
SCRIPT_GROUP
SCRIPT_USER
SERVER_ADDR
SERVER_ADMIN
SERVER_NAME
SERVER_PORT
SERVER_PROTOCOL
SERVER_SOFTWARE
TIME_YEAR
TIME_MON
TIME_DAY
TIME_HOUR
TIME_MIN
TIME_SEC
TIME_WDAY
TIME
API_VERSION
CONN_REMOTE_ADDR
HTTPS
IS_SUBREQ
REMOTE_ADDR
REQUEST_FILENAME
REQUEST_SCHEME
REQUEST_URI
THE_REQUEST
Все эти переменные соответствуют HTTP-заголовкам MIME с аналогичными именами, переменным C Apache HTTP Server или полям
struct tmсистемы Unix. Большинство из них описано здесь или в других разделах руководства либо в спецификации CGI.SERVER_NAME и SERVER_PORT зависят соответственно от значений
UseCanonicalNameиUseCanonicalPhysicalPort.К специальным переменным
mod_rewriteотносятся перечисленные ниже.API_VERSION- Это версия API модулей Apache httpd (внутреннего интерфейса между сервером и модулем) в текущей сборке httpd, определённая в include/ap_mmn.h. Версия API модулей соответствует используемой версии Apache httpd (например, в выпуске Apache httpd 1.3.14 это 19990320:10), но представляет интерес в основном для авторов модулей.
CONN_REMOTE_ADDR- Начиная с версии 2.4.8: IP-адрес узла-партнёра соединения (см. модуль
mod_remoteip). HTTPS- Содержит текст «on», если соединение использует SSL/TLS, и «off» в противном случае. (Эту переменную можно безопасно использовать независимо от того, загружен ли
mod_ssl.) IS_SUBREQ- Содержит текст «true», если обрабатываемый запрос является подзапросом, и «false» в противном случае. Подзапросы могут создаваться модулями, которым необходимо разрешить дополнительные файлы или URI для выполнения своих задач.
REMOTE_ADDR- IP-адрес удалённого узла (см. модуль
mod_remoteip). REQUEST_FILENAME- Полный локальный путь в файловой системе к файлу или сценарию, соответствующему запросу, если к моменту обращения к
REQUEST_FILENAMEсервер уже определил этот путь. В противном случае, например при использовании в контексте виртуального хоста, значение совпадает со значениемREQUEST_URI. В зависимости от значенияAcceptPathInfoсервер мог использовать для сопоставления запроса с файлом только некоторые начальные компонентыREQUEST_URI. REQUEST_SCHEME- Схема запроса (обычно «http» или «https»). На это значение можно повлиять с помощью
ServerName. REQUEST_URI- Компонент пути запрошенного URI, например «/index.html». Важно, что он не включает строку запроса, доступную как отдельная переменная с именем
QUERY_STRING. Значение, возвращаемое дляREQUEST_URI, уже декодировано из %-представления; чтобы закодировать его снова, передайте его через функцию сопоставления «escape» . THE_REQUEST- Полная строка HTTP-запроса, отправленная браузером серверу (например, «
GET /index.html HTTP/1.1»). Она не включает дополнительные заголовки, отправленные браузером. В отличие от большинства других переменных ниже, это значение не декодировано.
Если TestString имеет специальное значение expr, CondPattern будет обрабатываться как ap_expr. Ссылки на HTTP-заголовки в выражении будут добавлены в заголовок Vary, если не указан флаг novary.
Также следует учитывать следующее:
-
Переменные SCRIPT_FILENAME и REQUEST_FILENAME содержат одно и то же значение — значение поля
filenameвнутренней структурыrequest_recApache HTTP Server. Первое имя — это общепринятое имя переменной CGI, а второе является подходящим аналогом REQUEST_URI (содержащего значение поляuriструктурыrequest_rec).Если произошла подстановка и переписывание продолжается, значения обеих переменных будут соответственно обновлены.
При использовании в контексте сервера (то есть до сопоставления запроса с файловой системой) SCRIPT_FILENAME и REQUEST_FILENAME не могут содержать полный локальный путь в файловой системе, поскольку на этом этапе обработки путь неизвестен. В этом случае обе переменные изначально содержат значение REQUEST_URI. Чтобы получить полный локальный путь запроса в контексте сервера, используйте упреждающее получение данных на основе URL
%{LA-U:REQUEST_FILENAME}для определения окончательного значения REQUEST_FILENAME. - Также доступна переменная
%{ENV:variable}, где variable может быть любой переменной среды. Её значение ищется во внутренних структурах Apache httpd, а если там оно не найдено — вgetenv()процесса сервера Apache httpd. - Переменную
%{SSL:variable}, где variable — имя переменной среды SSL, можно использовать независимо от того, загружен лиmod_ssl, но если он не загружен, переменная всегда раскрывается в пустую строку. Например,%{SSL:SSL_CIPHER_USEKEYSIZE}может раскрыться в128. Эти переменные доступны и без задания параметраStdEnvVarsдирективыSSLOptions. - Конструкцию
%{HTTP:header}, где header может быть именем любого HTTP-заголовка MIME, всегда можно использовать для получения значения заголовка, отправленного в HTTP-запросе. Например,%{HTTP:Proxy-Connection}— это значение HTTP-заголовка «Proxy-Connection:».Если в условии используется HTTP-заголовок, он добавляется в заголовок Vary ответа, когда условие для запроса истинно. Если условие для запроса ложно, заголовок не добавляется. Добавление HTTP-заголовка в Vary ответа необходимо для корректного кэширования.
Следует помнить, что при использовании флага «
ornext|OR» условия проверяются с коротким замыканием, поэтому некоторые условия могут вообще не проверяться. -
%{LA-U:variable}можно использовать для упреждающего получения данных, выполняющего внутренний подзапрос (на основе URL), чтобы определить окончательное значение variable. Это позволяет получить доступ к переменной, нужной для переписывания, которая недоступна на текущем этапе, но будет установлена позднее.Например, чтобы переписывать URL в соответствии с переменной
REMOTE_USERиз контекста сервера (файлаhttpd.conf), необходимо использовать%{LA-U:REMOTE_USER}— эта переменная устанавливается на этапах авторизации, которые выполняются после этапа преобразования URL (во время которого работаетmod_rewrite).С другой стороны, поскольку
mod_rewriteреализует контекст отдельного каталога (файла.htaccess) на этапе Fixup API, а этапы авторизации выполняются до этого этапа, в этом контексте можно просто использовать%{REMOTE_USER}. -
%{LA-F:variable}можно использовать для выполнения внутреннего подзапроса (на основе имени файла) с целью определения окончательного значения variable. В большинстве случаев это то же самое, что и LA-U выше.
CondPattern — это шаблон условия, регулярное выражение, применяемое к текущему значению TestString. Перед сопоставлением с CondPattern сначала вычисляется TestString.
CondPattern обычно является регулярным выражением, совместимым с Perl, однако доступен дополнительный синтаксис для выполнения других полезных проверок TestString:
- Можно добавить перед строкой шаблона символ «
!» (восклицательный знак), чтобы инвертировать результат условия независимо от типа используемого CondPattern. - Можно выполнять лексикографическое сравнение строк:
- <CondPattern
- Лексикографически предшествует
CondPattern рассматривается как обычная строка и лексикографически сравнивается с TestString. Результат истинен, если TestString лексикографически предшествует CondPattern. - >CondPattern
- Лексикографически следует
CondPattern рассматривается как обычная строка и лексикографически сравнивается с TestString. Результат истинен, если TestString лексикографически следует за CondPattern. - =CondPattern
- Лексикографически равно
CondPattern рассматривается как обычная строка и лексикографически сравнивается с TestString. Результат истинен, если TestString лексикографически равен CondPattern (строки полностью совпадают, символ в символ). Если CondPattern — это""(две кавычки), сравнение выполняется между TestString и пустой строкой. - <=CondPattern
- Лексикографически меньше или равно
CondPattern рассматривается как обычная строка и лексикографически сравнивается с TestString. Результат истинен, если TestString лексикографически предшествует CondPattern или равен ему (строки совпадают, символ в символ). - >=CondPattern
- Лексикографически больше или равно
CondPattern рассматривается как обычная строка и лексикографически сравнивается с TestString. Результат истинен, если TestString лексикографически следует за CondPattern или равен ему (строки совпадают, символ в символ).
Примечание
Оператор сравнения строк является частью аргумента CondPattern и должен заключаться в кавычки, если они используются. Например:RewriteCond %{HTTP_USER_AGENT} "=This Robot/1.0" - Можно выполнять сравнение целых чисел:
- -eq
- Численно равно
TestString рассматривается как целое число и численно сравнивается с CondPattern. Результат истинен, если числа равны. - -ge
- Численно больше или равно
TestString рассматривается как целое число и численно сравнивается с CondPattern. Результат истинен, если TestString численно больше или равен CondPattern. - -gt
- Численно больше
TestString рассматривается как целое число и численно сравнивается с CondPattern. Результат истинен, если TestString численно больше CondPattern. - -le
- Численно меньше или равно
TestString рассматривается как целое число и численно сравнивается с CondPattern. Результат истинен, если TestString численно меньше или равен CondPattern. Чтобы не путать этот оператор с -l, используйте вариант -L или -h. - -lt
- Численно меньше
TestString рассматривается как целое число и численно сравнивается с CondPattern. Результат истинен, если TestString численно меньше CondPattern. Чтобы не путать этот оператор с -l, используйте вариант -L или -h. - -ne
- Численно не равно
TestString рассматривается как целое число и численно сравнивается с CondPattern. Результат истинен, если числа различаются. Эквивалентно!-eq.
- Можно выполнять различные проверки атрибутов файла:
- -d
- Является каталогом.
TestString рассматривается как путь, после чего проверяется, существует ли он и является ли каталогом. - -f
- Является обычным файлом.
TestString рассматривается как путь, после чего проверяется, существует ли он и является ли обычным файлом. - -F
- Файл существует, проверка через подзапрос.
Проверяет, является ли TestString допустимым файлом, доступным с учётом всех настроенных в данный момент для этого пути средств управления доступом сервера. Для проверки используется внутренний подзапрос, поэтому применяйте этот параметр осторожно — он может повлиять на производительность сервера! - -h
- Является символической ссылкой (соглашение bash).
См. -l. - -l
- Является символической ссылкой.
TestString рассматривается как путь, после чего проверяется, существует ли он и является ли символической ссылкой. Если возможна неоднозначность, например при использовании проверок -lt или -le, можно также использовать соглашение bash — -L или -h. - -L
- Является символической ссылкой (соглашение bash).
См. -l. - -s
- Является обычным файлом ненулевого размера.
TestString рассматривается как путь, после чего проверяется, существует ли он и является ли обычным файлом размером больше нуля. - -U
-
URL существует, проверка через подзапрос.
Проверяет, является ли TestString допустимым URL, доступным с учётом всех настроенных в данный момент для этого пути средств управления доступом сервера. Для проверки используется внутренний подзапрос, поэтому применяйте этот параметр осторожно — он может повлиять на производительность сервера!Этот флаг только возвращает сведения о таких параметрах, как управление доступом, аутентификация и авторизация. Этот флаг не возвращает сведения о коде состояния, который вернул бы настроенный обработчик (статический файл, CGI, прокси и т. д.).
- -x
- Имеет права на выполнение.
TestString рассматривается как путь, после чего проверяется, существует ли он и имеет ли права на выполнение. Эти права определяются базовой операционной системой.
RewriteCond /var/www/%{REQUEST_URI} !-f RewriteRule ^(.+) /other/archive/$1 [R] -
Если TestString имеет специальное значение
expr, CondPattern будет обрабатываться как ap_expr.В приведённом ниже примере
-strmatchиспользуется для сравненияREFERERс именем хоста сайта, чтобы блокировать нежелательные прямые ссылки на содержимое.RewriteCond expr "! %{HTTP_REFERER} -strmatch '*://%{HTTP_HOST}/*'" RewriteRule "^/images" "-" [F]
Также можно задать специальные флаги для CondPattern, добавив [flags] в качестве третьего аргумента директивы RewriteCond, где flags — список любых следующих флагов, разделённых запятыми:
- «
nocase|NC» (без учёта регистра)
Проверка выполняется без учёта регистра: различия между «A-Z» и «a-z» игнорируются как в раскрытом TestString, так и в CondPattern. Этот флаг действует только при сравнении TestString и CondPattern. Он не влияет на проверки файловой системы и подзапросов. - «
ornext|OR» (ИЛИ для следующего условия)
Используйте этот флаг, чтобы объединить условия правила локальным логическим ИЛИ вместо неявного И. Типичный пример:RewriteCond "%{REMOTE_HOST}" "^host1" [OR] RewriteCond "%{REMOTE_HOST}" "^host2" [OR] RewriteCond "%{REMOTE_HOST}" "^host3" RewriteRule ...some special stuff for any of these hosts...Без этого флага пару «условие/правило» пришлось бы записывать трижды. - «
novary|NV» (без Vary)
Если в условии используется HTTP-заголовок, этот флаг предотвращает его добавление в заголовок Vary ответа.
Использование этого флага может нарушить корректное кэширование ответа, если представление ответа зависит от значения данного заголовка. Поэтому используйте флаг только при условии, что вы хорошо понимаете назначение заголовка Vary.
Пример:
Чтобы переписывать главную страницу сайта в зависимости от заголовка запроса «User-Agent:», можно использовать следующее:
RewriteCond "%{HTTP_USER_AGENT}" "(iPhone|Blackberry|Android)"
RewriteRule "^/$" "/homepage.mobile.html" [L]
RewriteRule "^/$" "/homepage.std.html" [L] Пояснение: если вы используете браузер, который идентифицирует себя как мобильный (обратите внимание, что пример неполный, поскольку существует множество других мобильных платформ), будет показана мобильная версия главной страницы. В противном случае будет показана стандартная страница.
По умолчанию несколько директив RewriteCond проверяются последовательно с неявным логическим оператором И. Если условие не выполняется и флаг OR не указан, весь набор правил прекращает обработку, а дальнейшие условия не проверяются.
Директива RewriteEngine
| Описание: | Включает или отключает механизм переписывания во время выполнения |
|---|---|
| Синтаксис: | RewriteEngine on|off |
| Значение по умолчанию: | RewriteEngine off |
| Контекст: | конфигурация сервера, виртуальный хост, каталог, .htaccess |
| Переопределение: | FileInfo |
| Статус: | Расширение |
| Модуль: | mod_rewrite |
Директива RewriteEngine включает или отключает механизм переписывания во время выполнения. Если задано значение off, модуль вообще не выполняет обработку во время выполнения. Он даже не обновляет переменные среды SCRIPT_URx.
Используйте эту директиву, чтобы отключить правила в определённом контексте, вместо того чтобы комментировать все директивы RewriteRule.
Обратите внимание, что конфигурации переписывания не наследуются виртуальными хостами. Это означает, что директиву RewriteEngine on нужно задать для каждого виртуального хоста, в котором вы хотите использовать правила переписывания.
Директивы RewriteMap типа prg не запускаются при инициализации сервера, если они определены в контексте, где для RewriteEngine не задано значение on
Директива RewriteMap
| Описание: | Задаёт функцию сопоставления для поиска по ключу |
|---|---|
| Синтаксис: | RewriteMap MapName MapType:MapSource [MapTypeOptions] |
| Контекст: | конфигурация сервера, виртуальный хост |
| Статус: | Расширение |
| Модуль: | mod_rewrite |
| Совместимость: | Третий параметр, MapTypeOptions, доступен только в Apache 2.4.29 и более поздних версиях |
Директива RewriteMap задаёт карту переписывания, которую можно использовать внутри строк подстановки правил с помощью функций сопоставления для вставки или подстановки значений, найденных по ключу. Источники для такого поиска могут быть разных типов.
MapName — это имя карты. Оно используется для указания функции сопоставления в строках подстановки правила переписывания с помощью одной из следующих конструкций:
${ MapName : LookupKey }
${ MapName : LookupKey | DefaultValue }
При наличии такой конструкции выполняется поиск в карте MapName по ключу LookupKey. Если ключ найден, конструкция функции сопоставления заменяется на SubstValue. Если ключ не найден, она заменяется на DefaultValue или на пустую строку, если значение DefaultValue не указано. Пустые значения обрабатываются так же, как отсутствующие ключи, поэтому отличить ключ со значением пустой строки от отсутствующего ключа невозможно.
Например, можно определить RewriteMap следующим образом:
RewriteMap examplemap "txt:/path/to/file/map.txt"
Затем эту карту можно использовать в RewriteRule следующим образом:
RewriteRule "^/ex/(.*)" "${examplemap:$1}" Значение аргумента MapTypeOptions зависит от конкретного MapType. Дополнительные сведения см. в разделе Использование RewriteMap.
Можно использовать следующие сочетания MapType и MapSource:
- txt
- Обычный текстовый файл со списком пар ключ-значение, разделённых пробелами, по одной паре на строку. (Подробнее ...)
- rnd
- Случайный выбор записи из обычного текстового файла (Подробнее ...)
- dbm
- Поиск записи в файле dbm, содержащем пары имя-значение. Хеш создаётся из текстового файла с помощью утилиты
httxt2dbm. (Подробнее ...) - int
- Одна из четырёх доступных встроенных функций, предоставляемых
RewriteMap: toupper, tolower, escape или unescape. (Подробнее ...) - prg
- Вызов внешней программы или сценария для обработки переписывания. (Подробнее ...)
- dbd или fastdbd
- Инструкция SQL SELECT для поиска цели переписывания. (Подробнее ...)
Дополнительные сведения и многочисленные примеры приведены в руководстве по RewriteMap
Директива RewriteOptions
| Описание: | Задаёт специальные параметры для механизма перезаписи |
|---|---|
| Синтаксис: | RewriteOptions Options |
| Контекст: | конфигурация сервера, виртуальный хост, каталог, .htaccess |
| Переопределение: | FileInfo |
| Статус: | Расширение |
| Модуль: | mod_rewrite |
Директива RewriteOptions задаёт специальные параметры для текущей конфигурации уровня сервера или каталога. Строка Option в настоящее время может принимать только одно из следующих значений:
Inherit-
Эта настройка заставляет текущую конфигурацию наследовать конфигурацию родительского уровня. В контексте виртуального сервера это означает наследование карт, условий и правил главного сервера. В контексте каталога наследуются условия и правила родительской конфигурации
.htaccessили разделов<Directory>. Унаследованные правила виртуально копируются в раздел, где используется эта директива. Если она используется вместе с локальными правилами, унаследованные правила копируются после локальных. Положение этой директивы — до или после локальных правил — не влияет на такое поведение. Если локальные правила принудительно остановили перезапись, унаследованные правила не будут обработаны.Правила, унаследованные от родительской области, применяются после правил, заданных в дочерней области. InheritBefore-
Как и
Inheritвыше, но правила родительской области применяются до правил, заданных в дочерней области.
Доступно в Apache HTTP Server 2.3.10 и более поздних версиях. InheritDown-
Если этот параметр включён, все дочерние конфигурации наследуют конфигурацию текущей конфигурации. Это эквивалентно указанию
RewriteOptions Inheritво всех дочерних конфигурациях. Дополнительные сведения об обработке связей между родительскими и дочерними конфигурациями см. в описании параметраInherit.
Доступно в Apache HTTP Server 2.4.8 и более поздних версиях. InheritDownBefore-
Как и
InheritDownвыше, но правила текущей области применяются до правил, заданных в любой дочерней области.
Доступно в Apache HTTP Server 2.4.8 и более поздних версиях. IgnoreInherit-
Этот параметр заставляет текущую и дочерние конфигурации игнорировать все правила, которые наследовались бы от родительской конфигурации с параметром
InheritDownилиInheritDownBefore.
Доступно в Apache HTTP Server 2.4.8 и более поздних версиях. AllowNoSlash-
По умолчанию
mod_rewriteигнорирует URL-адреса, соответствующие каталогу на диске, но не оканчивающиеся косой чертой. Предполагается, что модульmod_dirперенаправит клиента на канонический URL-адрес с завершающей косой чертой.Если директива
DirectorySlashустановлена в значение off, можно включить параметрAllowNoSlash, чтобы правила перезаписи больше не игнорировались. Этот параметр позволяет при необходимости применять правила перезаписи из файлов .htaccess, соответствующие каталогу без завершающей косой черты.
Доступно в Apache HTTP Server 2.4.0 и более поздних версиях. AllowAnyURI-
Если
RewriteRuleиспользуется в контекстеVirtualHostили сервера с версией httpd 2.2.22 или более поздней,mod_rewriteбудет обрабатывать правила перезаписи, только если URI запроса является путём URL. Это позволяет избежать некоторых проблем безопасности, при которых определённые правила могли приводить к «неожиданному» расширению шаблонов (см. CVE-2011-3368 и CVE-2011-4317). Чтобы снять ограничение на сопоставление с путём URL, можно включить параметрAllowAnyURI. Тогдаmod_rewriteбудет применять набор правил к любой строке URI запроса независимо от того, соответствует ли эта строка грамматике пути URL, требуемой спецификацией HTTP.
Доступно в Apache HTTP Server 2.4.3 и более поздних версиях.Предупреждение о безопасности
Включение этого параметра может сделать сервер уязвимым, если он используется с правилами перезаписи, составленными без должной осторожности. Настоятельно рекомендуется не использовать этот параметр. В частности, остерегайтесь входных строк, содержащих символ «
@», который может изменить интерпретацию преобразованного URI, как описано в указанных выше CVE. MergeBase-
При использовании этого параметра значение
RewriteBaseкопируется из места, где оно задано явно, во все подкаталоги или подрасположения, в которых не задан собственныйRewriteBase. Такое поведение было задано по умолчанию в версиях с 2.4.0 по 2.4.3; флаг для его восстановления доступен в Apache HTTP Server 2.4.4 и более поздних версиях. IgnoreContextInfo-
Когда в контексте каталога (htaccess) выполняется относительная подстановка и параметр
RewriteBaseне задан, этот модуль использует дополнительные сведения о контексте URL и файловой системы, чтобы преобразовать относительную подстановку обратно в URL. Такие модули, какmod_userdirиmod_alias, предоставляют эти дополнительные сведения о контексте. Доступно в версии 2.4.16 и более поздних версиях. LegacyPrefixDocRoot-
До версии 2.4.26, если подстановка представляла собой абсолютный URL, соответствующий текущему виртуальному хосту, URL мог сначала преобразовываться в путь URL, а затем — в локальный путь. Поскольку URL может быть преобразован в локальный путь, перед этим путём следует указывать корневой каталог документов. Это предотвращает доступ к файлу, например /tmp/myfile, при запросе http://host/file/myfile со следующим
RewriteRule.RewriteRule /file/(.*) http://localhost/tmp/$1
Этот параметр позволяет использовать прежнее поведение, при котором корневой каталог документов не добавляется к локальному пути, полученному преобразованием URL. Доступно в версии 2.4.26 и более поздних версиях.
Директива RewriteRule
| Описание: | Задаёт правила для механизма перезаписи |
|---|---|
| Синтаксис: | RewriteRule Pattern Substitution [flags] |
| Контекст: | конфигурация сервера, виртуальный хост, каталог, .htaccess |
| Переопределение: | FileInfo |
| Статус: | Расширение |
| Модуль: | mod_rewrite |
Директива RewriteRule — основной рабочий инструмент перезаписи. Директиву можно использовать несколько раз; каждый экземпляр задаёт одно правило перезаписи. Порядок задания этих правил важен: именно в этом порядке они применяются во время выполнения.
Шаблон представляет собой регулярное выражение, совместимое с Perl. Строка, с которой сравнивается этот шаблон, зависит от того, где задана директива RewriteRule.
С чем выполняется сопоставление?
В контексте
VirtualHostШаблон сначала сопоставляется с частью URL после имени хоста и порта, но до строки запроса (например, «/app1/index.html»). Это путь URL с декодированными %-последовательностями.-
В контексте каталога (
Directoryи .htaccess) Шаблон сопоставляется только с частью пути. Например, запрос «/app1/index.html» может сопоставляться с «app1/index.html» или «index.html» в зависимости от того, где задана директиваRewriteRule.Перед сравнением путь каталога, в котором задано правило, удаляется из текущего отображённого пути файловой системы (вплоть до завершающей косой черты включительно). В результате такого удаления префикса в контексте каталога правила сопоставляются только с частью текущего отображённого пути файловой системы, расположенной «ниже» каталога, в котором задано правило.
Текущий отображённый путь файловой системы определяется такими директивами, как
DocumentRootиAlias, а также результатом предыдущих подстановокRewriteRule. Чтобы сопоставить имя хоста, порт или строку запроса, используйте
RewriteCondс переменными%{HTTP_HOST},%{SERVER_PORT}или%{QUERY_STRING}соответственно.
Перезапись в контексте каталога
- Механизм перезаписи можно использовать в файлах .htaccess и разделах
<Directory>, но это требует учёта некоторых дополнительных нюансов. - Чтобы включить механизм перезаписи в этом контексте, необходимо установить значение «
RewriteEngine On» и включить «Options FollowSymLinks». Если администратор запретил переопределениеFollowSymLinksдля каталога пользователя, использовать механизм перезаписи нельзя. Это ограничение необходимо по соображениям безопасности. - Дополнительные сведения о том, какой префикс будет добавлен обратно к относительным подстановкам, см. в описании директивы
RewriteBase. - Чтобы сопоставить полный путь URL в RewriteRule для контекста каталога (htaccess), используйте переменную
%{REQUEST_URI}вRewriteCond. - Удалённый префикс всегда заканчивается косой чертой, поэтому сопоставление выполняется со строкой, которая никогда не начинается с косой черты. Следовательно, Шаблон с
^/никогда не соответствует в контексте каталога. - Хотя синтаксис допускает правила перезаписи в разделах
<Location>и<Files>(включая соответствующие им разделы с регулярными выражениями), это никогда не должно требоваться и не поддерживается. В таких контекстах, вероятнее всего, перестанут работать относительные подстановки. - Для блоков
Ifдействуют правила контекста каталога. - По умолчанию mod_rewrite переопределяет правила при объединении разделов, принадлежащих одному контексту. Директива
RewriteOptionsможет изменить это поведение, например с помощью настройки Inherit. - Директива
RewriteOptionsтакже регулирует поведение разделов, заданных на одном уровне вложенности конфигурации. В следующем примере по умолчанию учитываются только RewriteRule, заданные во втором блокеIf, поскольку первые правила переопределяются. ИспользованиеRewriteOptionsInherit заставляет mod_rewrite объединить два раздела и учитывать оба набора директив, а не только последний.
<If "true"> # Without RewriteOptions Inherit, this rule is overridden by the next # section and no redirect will happen for URIs containing 'foo' RewriteRule foo http://example.com/foo [R] </If> <If "true"> RewriteRule bar http://example.com/bar [R] </If>
Подсказки по регулярным выражениям см. во введении в mod_rewrite.
В mod_rewrite символ NOT («!») также можно использовать в качестве префикса шаблона. Это позволяет инвертировать шаблон, например указать: «если текущий URL НЕ соответствует этому шаблону». Это может быть полезно в исключительных случаях, когда проще сопоставить отрицательный шаблон, или в качестве последнего правила по умолчанию.
Примечание
При использовании символа NOT для инвертирования шаблона в него нельзя включать групповые подстановочные части. Это связано с тем, что при несовпадении шаблона (то есть при совпадении с инвертированным шаблоном) содержимое групп отсутствует. Поэтому при использовании инвертированных шаблонов нельзя использовать$N в строке подстановки! Подстановка правила перезаписи — это строка, заменяющая исходный путь URL, соответствующий Шаблону. Подстановка может быть:
- путём файловой системы
- Указывает расположение ресурса в файловой системе, который будет передан клиенту. Подстановки обрабатываются как пути файловой системы только в том случае, если правило задано в контексте сервера (виртуального хоста) и первый компонент пути подстановки существует в файловой системе.
- путём URL
- Путь к ресурсу, который будет обслужен, относительно
DocumentRoot. Обратите внимание:mod_rewriteпытается определить, указали ли вы путь файловой системы или путь URL, проверяя, существует ли первый сегмент пути в корне файловой системы. Например, если в качестве строки Подстановки указано/www/file.html, она будет обработана как путь URL, если только в корне файловой системы (или, при использовании перезаписи в файле.htaccess, относительно корневого каталога документов) не существует каталога с именемwww. В этом случае она будет обработана как путь файловой системы. Чтобы к полученному пути URL применялись другие директивы сопоставления URL (например,Alias), используйте флаг[PT], описанный ниже. - абсолютным URL
-
Если указан абсолютный URL,
mod_rewriteпроверяет, совпадает ли имя хоста с текущим хостом. Если совпадает, схема и имя хоста удаляются, а полученный путь обрабатывается как путь URL. В противном случае выполняется внешнее перенаправление на указанный URL. О том, как принудительно выполнить внешнее перенаправление на текущий хост, см. описание флага[R]ниже.Обратите внимание: при перенаправлении с использованием абсолютного URI — явном или неявном — строка запроса из исходного запроса будет включена. Чтобы этого избежать, см. описание флага
[QSD]ниже. -
-(дефис) - Дефис указывает, что подстановку выполнять не нужно (существующий путь передаётся без изменений). Используется, когда необходимо применить флаг (см. ниже), не изменяя путь.
Помимо обычного текста строка Подстановки может содержать:
- обратные ссылки (
$N) на шаблон RewriteRule - обратные ссылки (
%N) на последний сопоставленный шаблон RewriteCond - переменные сервера, как в строках проверки условий правила (
%{VARNAME}) -
вызовы функций сопоставления (
${mapname:key|default})
Обратные ссылки — это идентификаторы вида $N (N=0..9), которые заменяются содержимым N-й группы совпавшего Шаблона. Переменные сервера те же, что и для TestString директивы RewriteCond. Функции сопоставления задаются директивой RewriteMap и описаны в её документации. Эти три типа переменных раскрываются в указанном выше порядке.
Правила перезаписи применяются к результатам предыдущих правил перезаписи в порядке их определения в файле конфигурации. Путь URL или путь файловой системы (см. раздел «С чем выполняется сопоставление?» выше) полностью заменяется на Подстановку, после чего процесс перезаписи продолжается до применения всех правил или до его явного завершения с помощью флага L либо другого флага, предполагающего немедленное завершение, например END или F.
Изменение строки запроса
По умолчанию строка запроса передаётся без изменений. Однако в строке подстановки можно создавать URL, содержащие часть строки запроса. Для этого достаточно использовать знак вопроса внутри строки подстановки, чтобы указать, что следующий текст нужно добавить обратно в строку запроса. Чтобы удалить существующую строку запроса, завершите строку подстановки одним знаком вопроса. Для объединения новых и старых строк запроса используйте флаг [QSA].
Кроме того, можно задать специальные действия, добавив [флаги] в качестве третьего аргумента директивы RewriteRule. Флаги — это заключённый в квадратные скобки список флагов, разделённых запятыми. Подробные сведения и примеры использования каждого флага приведены в документе «Флаги перезаписи».
| Флаг и синтаксис | Функция |
|---|---|
| B | Экранирует неалфавитно-цифровые символы в обратных ссылках перед применением преобразования. Аналогичное экранирование переменных сервера описано в разделе о функции сопоставления «escape».подробнее ... |
| BCTLS | Как [B], но экранирует только управляющие символы и пробелы. подробнее ... |
| BNE | Символы из [B] или [BCTLS], которые не следует экранировать. подробнее ... |
| backrefnoplus|BNP | Если обратные ссылки экранируются, пробелы следует заменять на %20, а не на +. Полезно, когда обратная ссылка используется в компоненте пути, а не в строке запроса.подробнее ... |
| chain|C | Связывает правило со следующим правилом. Если правило не срабатывает, связанные с ним правила пропускаются. подробнее ... |
| cookie|CO=NAME:VAL | Устанавливает cookie в браузере клиента. Полный синтаксис: CO=NAME:VAL:domain[:lifetime[:path[:secure[:httponly[samesite]]]]] подробнее ... |
| 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 указанному обработчику содержимого (Content-handler) для обработки. подробнее ... |
| 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 | Указывает механизму перезаписи пропустить следующие num правил, если текущее правило совпало. подробнее ... |
| type|T=MIME-type | Принудительно задаёт целевому файлу указанный тип MIME. подробнее ... |
| UnsafeAllow3F | Разрешает подстановки из URL, которые могут быть небезопасными. подробнее ... |
| UnsafePrefixStat | Разрешает потенциально небезопасные подстановки из начальной переменной или обратной ссылки в путь файловой системы. подробнее ... Доступно в Apache HTTP Server 2.4.60 и более поздних версиях. |
| UNC | Запрещает объединение нескольких начальных косых черт, используемых в путях UNC Windows. подробнее ... Доступно в Apache HTTP Server 2.4.62 и более поздних версиях. |
Подстановка домашнего каталога
Если строка подстановки начинается со строки, похожей на «/~user» (указанной явно или с помощью обратных ссылок), mod_rewrite выполняет подстановку домашнего каталога независимо от наличия или конфигурации mod_userdir.
Эта подстановка не выполняется, если для директивы RewriteRule используется флаг PT.
Ниже перечислены все возможные варианты подстановки и их значения:
В конфигурации уровня сервера (httpd.conf)
для запроса «GET /somepath/pathinfo»:
| Заданное правило | Результирующая подстановка |
|---|---|
| ^/somepath(.*) otherpath$1 | недопустимо, не поддерживается |
| ^/somepath(.*) otherpath$1 [R] | недопустимо, не поддерживается |
| ^/somepath(.*) otherpath$1 [P] | недопустимо, не поддерживается |
| ^/somepath(.*) /otherpath$1 | /otherpath/pathinfo |
| ^/somepath(.*) /otherpath$1 [R] | http://thishost/otherpath/pathinfo посредством внешнего перенаправления |
| ^/somepath(.*) /otherpath$1 [P] | не имеет смысла, не поддерживается |
| ^/somepath(.*) http://thishost/otherpath$1 | /otherpath/pathinfo |
| ^/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, с RewriteBase "/somepath")
для запроса «GET /somepath/localpath/pathinfo»:
| Заданное правило | Результирующая подстановка |
|---|---|
| ^localpath(.*) otherpath$1 | /somepath/otherpath/pathinfo |
| ^localpath(.*) otherpath$1 [R] | http://thishost/somepath/otherpath/pathinfo посредством внешнего перенаправления |
| ^localpath(.*) otherpath$1 [P] | не имеет смысла, не поддерживается |
| ^localpath(.*) /otherpath$1 | /otherpath/pathinfo |
| ^localpath(.*) /otherpath$1 [R] | http://thishost/otherpath/pathinfo посредством внешнего перенаправления |
| ^localpath(.*) /otherpath$1 [P] | не имеет смысла, не поддерживается |
| ^localpath(.*) http://thishost/otherpath$1 | /otherpath/pathinfo |
| ^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 через внутренний прокси |
© 2018 The Apache Software Foundation
Licensed under the Apache License, Version 2.0.
https://httpd.apache.org/docs/2.4/en/mod/mod_rewrite.html