Модуль Apache mod_rewrite
| Описание: | Предоставляет движок переписывания на основе правил для переписывания запрошенных URL на лету |
|---|---|
| Статус: | Расширение |
| Идентификатор модуля: | rewrite_module |
| Файл исходного кода: | mod_rewrite.c |
Краткое описание
Модуль mod_rewrite использует движок переписывания на основе правил, основанный на парсере регулярных выражений PCRE, для переписывания запрошенных URL на лету. По умолчанию mod_rewrite сопоставляет URL с путем к файлам. Однако он также может использоваться для перенаправления одного 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, который будет использоваться для директивы переписывания по каталогам (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 определяет условие правила. Одна или несколько RewriteCond могут предшествовать директиве RewriteRule. Затем правило используется только в том случае, если текущее состояние 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 для получения более подробной информации. - Переменные сервера: Это переменные вида
%{ИМЯ_ПЕРЕМЕННОЙ}, где ИМЯ_ПЕРЕМЕННОЙ может быть строкой из следующего списка: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 или полям
struct tmUnix-системы. Большинство из них документированы здесь или в другом месте руководства или в спецификации 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. THE_REQUEST- Полная строка HTTP-запроса, отправленная браузером на сервер (например, «
GET /index.html HTTP/1.1»). Она не включает дополнительные заголовки, отправленные браузером. Это значение не было обработано (декодировано), в отличие от большинства других переменных ниже.
Если TestString имеет специальное значение expr, CondPattern будет обрабатываться как ap_expr. HTTP-заголовки, упомянутые в выражении, будут добавлены в заголовок Vary, если флаг novary не указан.
Другие моменты, которые следует учитывать:
-
Переменные SCRIPT_FILENAME и REQUEST_FILENAME содержат одинаковое значение — значение поля
filenameвнутренней структуры Apache HTTP Server. Первое имя — это общеизвестное имя CGI-переменной, а второе — соответствующий аналог REQUEST_URI (который содержит значение поляuriструктурыrequest_rec).Если произошла подстановка и перенаправление продолжается, значение обеих переменных будет обновлено соответственно.
Если используется контекст сервера (т.е., до сопоставления запроса с файловой системой), SCRIPT_FILENAME и REQUEST_FILENAME не могут содержать полный локальный путь, поскольку путь неизвестен на этой стадии обработки. В этом случае обе переменные будут изначально содержать значение REQUEST_URI. Чтобы получить полный локальный путь к запросу в контексте сервера, используйте URL-просмотр вперёд
%{LA-U:REQUEST_FILENAME}для определения окончательного значения REQUEST_FILENAME. -
%{ENV:variable}, где переменная может быть любой переменной окружения, также доступна. Она ищется во внутренних структурах Apache httpd и (если не найдена там) черезgetenv()из процесса Apache httpd. -
%{SSL:variable}, где переменная — имя переменной окружения SSL, может быть использована с загрузкой или без модуляmod_ssl, но всегда будет расширяться до пустой строки, если модуль не загружен. Например,%{SSL:SSL_CIPHER_USEKEYSIZE}может расширяться до128. Эти переменные доступны даже без установки параметраStdEnvVarsдирективыSSLOptions. -
%{HTTP:header}, где заголовок может быть любым именем HTTP MIME-заголовка, всегда может быть использован для получения значения заголовка, отправленного в HTTP-запросе. Например,%{HTTP:Proxy-Connection}— это значение HTTP-заголовка ``Proxy-Connection:''.Если HTTP-заголовок используется в условии, этот заголовок добавляется в заголовок Vary ответа в случае, если условие истинно для запроса. Он не добавляется, если условие ложно для запроса. Добавление HTTP-заголовка в заголовок Vary ответа необходимо для правильного кэширования.
Следует учитывать, что условия следуют логике короткого замыкания в случае флага «
ornext|OR», поэтому некоторые условия могут вообще не оцениваться. -
%{LA-U:variable}может использоваться для предварительного просмотра, который выполняет внутренний (основанный на URL) подзапрос для определения окончательного значения переменной. Это может быть использовано для доступа к переменной для перенаправления, которая недоступна на текущем этапе, но будет установлена на более поздней фазе.Например, для перенаправления в соответствии с переменной
REMOTE_USERиз контекста сервера (файлhttpd.conf) необходимо использовать%{LA-U:REMOTE_USER}— эта переменная устанавливается фазами авторизации, которые выполняются после фазы преобразования URL (во время которой работаетmod_rewrite).С другой стороны, поскольку
mod_rewriteреализует свой контекст по каталогам (файл.htaccess) через фазу Fixup API и поскольку фазы авторизации выполняются перед этой фазой, в этом контексте можно использовать просто%{REMOTE_USER}. -
%{LA-F:variable}может использоваться для выполнения внутреннего (основанного на имени файла) подзапроса для определения окончательного значения переменной. В большинстве случаев это то же самое, что и LA-U выше.
CondPattern — это шаблон условия, регулярное выражение, которое применяется к текущей TestString. TestString оценивается первым, прежде чем сопоставляться с CondPattern.
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 обрабатывается как путь и проверяется, существует ли он и является ли символической ссылкой. Также можно использовать соглашение bash -L или -h, если есть вероятность путаницы, например, при использовании тестов -lt или -le. - -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' (без изменения)
Если в условии используется заголовок HTTP, этот флаг предотвращает добавление этого заголовка в заголовок Vary ответа.
Использование этого флага может нарушить правильное кэширование ответа, если представление этого ответа зависит от значения этого заголовка. Поэтому этот флаг следует использовать только если смысл заголовка Vary хорошо понятен.
Пример:
Чтобы переписать домашнюю страницу сайта в соответствии с заголовком «User-Agent:» запроса, можно использовать следующее:
RewriteCond "%{HTTP_USER_AGENT}" "(iPhone|Blackberry|Android)"
RewriteRule "^/$" "/homepage.mobile.html" [L]
RewriteRule "^/$" "/homepage.std.html" [L] Объяснение: Если вы используете браузер, который идентифицирует себя как мобильный браузер (обратите внимание, что пример неполный, так как существует много других мобильных платформ), отображается мобильная версия домашней страницы. В противном случае отображается стандартная страница.
Директива 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) — это имя карты, которое будет использоваться для указания функции сопоставления для строк подстановки правила переписывания через следующие конструкции:
${ ИмяКарты : КлючПоиска }
${ ИмяКарты : КлючПоиска | ЗначениеПоУмолчанию }
Когда такая конструкция встречается, карта ИмяКарты используется для поиска ключа КлючПоиска. Если ключ найден, конструкция функции сопоставления заменяется на ЗначениеПодстановки. Если ключ не найден, он заменяется на ЗначениеПоУмолчанию или пустую строку, если ЗначениеПоУмолчанию не указано. Пустые значения ведут себя так, как будто ключ отсутствует, поэтому невозможно отличить пустые значения ключей от отсутствующих.
Например, вы можете определить карту 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-
Перед версией 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шаблон Pattern изначально сопоставляется с частью URL после имени хоста и порта и перед строкой запроса (например, "/app1/index.html"). Это (%-декодированный) путь URL.-
В контексте каталога (
Directoryи .htaccess) шаблон Pattern сопоставляется только с частью пути, например, при запросе "/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 в переписывании по каталогу (htaccess), используйте переменную
%{REQUEST_URI}вRewriteCond. - Удаленный префикс всегда заканчивается слешем, что означает, что сопоставление происходит со строкой, которая никогда не имеет ведущего слеша. Поэтому шаблон Pattern с
^/никогда не сопоставляется в контексте каталога. - Хотя правила переписывания синтаксически разрешены в секциях
<Location>и<Files>(включая их аналоги с регулярными выражениями), это никогда не должно быть необходимо и не поддерживается. Вероятно, в этих контекстах сломаются относительные подстановки. - Блоки
Ifследуют правилам контекста каталога. - По умолчанию mod_rewrite переопределяет правила при слиянии секций, принадлежащих одному контексту. Директива
RewriteOptionsможет изменить это поведение, например, используя настройку Inherit. - Директива
RewriteOptionsтакже регулирует поведение секций, указанных на одном уровне вложенности конфигурации. В следующем примере по умолчанию рассматриваются только правила переписывания, указанные во втором блоке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, символ НЕ ('!') также доступен в качестве возможного префикса шаблона. Это позволяет вам инвертировать шаблон; например, сказать: «если текущий URL не соответствует этому шаблону». Это может использоваться для исключительных случаев, когда легче сопоставить обратный шаблон, или как последнее правило по умолчанию.
Примечание
При использовании символа НЕ для инвертирования шаблона вы не можете включать групповые части с подстановочными знаками в этот шаблон. Это связано с тем, что, когда шаблон не соответствует (т.е., соответствует отрицание), для групп нет содержимого. Таким образом, если используются инвертированные шаблоны, вы не можете использовать$N в строке подстановки!Подстановка правила переписывания — это строка, которая заменяет исходный путь URL, соответствующий Pattern. Подстановка может быть:
- путь к файловой системе
- Указывает расположение ресурса в файловой системе, которое будет передано клиенту. Подстановки рассматриваются как путь к файловой системе только в том случае, если правило настроено в контексте сервера (виртуального хоста), а первая часть пути в подстановке существует в файловой системе
- путь URL
- Относительный к
DocumentRootпуть к ресурсу, который нужно предоставить. Обратите внимание, чтоmod_rewriteпытается угадать, указали ли вы путь к файловой системе или путь URL, проверяя, существует ли первый сегмент пути в корне файловой системы. Например, если вы указываете строку Substitution/www/file.html, то она будет рассматриваться как путь URL, за исключением случаев, когда каталог под названиемwwwсуществует в корне файловой системы (или, в случае использования переписываний в файле.htaccess, относительно корня документа), в этом случае она будет рассматриваться как путь к файловой системе. Если вы хотите, чтобы другие директивы сопоставления URL (например,Alias) применялись к полученному пути URL, используйте флаг[PT]как описано ниже. - абсолютный URL
- Если указан абсолютный URL,
mod_rewriteпроверяет, совпадает ли имя хоста с текущим хостом. Если совпадает, схема и имя хоста удаляются, и полученный путь рассматривается как путь URL. В противном случае выполняется внешний редирект на указанный URL. Чтобы принудительно выполнить внешний редирект на текущий хост, см. флаг[R]ниже. -
-(тире) - Тире означает, что подстановка не должна выполняться (существующий путь передаётся без изменений). Это используется, когда флаг (см. ниже) должен применяться без изменения пути.
В дополнение к простому тексту строка Substitution может включать
- обратные ссылки (
$N) на шаблон RewriteRule - обратные ссылки (
%N) на последний сопоставленный шаблон RewriteCond - переменные сервера, как в строках условия проверки (
%{VARNAME}) -
вызовы функций сопоставления (
${mapname:key|default})
Обратные ссылки — это идентификаторы вида $N (N=0..9), которые будут заменены содержимым N-й группы сопоставленного шаблона Pattern. Переменные сервера такие же, как для строки TestString директивы RewriteCond. Функции сопоставления взяты из директивы RewriteMap и объяснены там. Эти три типа переменных расширяются в указанном порядке.
Правила переписывания применяются к результатам предыдущих правил переписывания в том порядке, в котором они определены в файле конфигурации. Путь URL или путь к файловой системе (см. "Что сопоставляется?", выше) полностью заменяется Substitution, и процесс переписывания продолжается до тех пор, пока не будут применены все правила, или он не будет явно завершён флагом L, или другим флагом, подразумевающим немедленное завершение, таким как END или F.
Изменение строки запроса
По умолчанию строка запроса передаётся без изменений. Однако вы можете создавать URL в строке подстановки, содержащей часть строки запроса. Просто используйте вопросительный знак внутри строки подстановки, чтобы указать, что следующий текст должен быть повторно вставлен в строку запроса. Если вы хотите удалить существующую строку запроса, закончите строку подстановки одним вопросительным знаком. Чтобы объединить новую и старую строки запроса, используйте флаг [QSA].
Кроме того, вы можете установить специальные действия, которые должны выполняться путём добавления [флагов] в качестве третьего аргумента директивы RewriteRule. Флаги — это список флагов, разделённых запятыми, в квадратных скобках, из любой таблицы ниже. Дополнительные сведения и примеры для каждого флага доступны в документе Флаги переписывания.
| Флаг и синтаксис | Функция |
|---|---|
| B | Выполнить экранирование небуквенно-цифровых символов в обратных ссылках перед применением преобразования. подробнее ... |
| 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-тип целевого файла на указанный тип. подробнее ... |
Расширение домашнего каталога
Когда строка подстановки начинается со строки, похожей на "/~user" (через явное текстовое значение или обратные ссылки), mod_rewrite выполняет расширение домашнего каталога независимо от наличия или конфигурации mod_userdir.
Это расширение не происходит, когда флаг PT используется в директиве RewriteRule.
Ниже приведены все возможные комбинации подстановок и их значения:
Внутри конфигурации сервера (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