Spec-Zone.ru › Apache HTTP Server

Модуль 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 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.
    THE_REQUEST
    Полная строка HTTP-запроса, отправленная браузером на сервер (например, «GET /index.html HTTP/1.1»). Она не включает дополнительные заголовки, отправленные браузером. Это значение не было обработано (декодировано), в отличие от большинства других переменных ниже.

Если TestString имеет специальное значение expr, CondPattern будет обрабатываться как ap_expr. HTTP-заголовки, упомянутые в выражении, будут добавлены в заголовок Vary, если флаг novary не указан.

Другие моменты, которые следует учитывать:

  1. Переменные 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.

  2. %{ENV:variable}, где переменная может быть любой переменной окружения, также доступна. Она ищется во внутренних структурах Apache httpd и (если не найдена там) через getenv() из процесса Apache httpd.
  3. %{SSL:variable}, где переменная — имя переменной окружения SSL, может быть использована с загрузкой или без модуля mod_ssl, но всегда будет расширяться до пустой строки, если модуль не загружен. Например, %{SSL:SSL_CIPHER_USEKEYSIZE} может расширяться до 128. Эти переменные доступны даже без установки параметра StdEnvVars директивы SSLOptions.
  4. %{HTTP:header}, где заголовок может быть любым именем HTTP MIME-заголовка, всегда может быть использован для получения значения заголовка, отправленного в HTTP-запросе. Например, %{HTTP:Proxy-Connection} — это значение HTTP-заголовка ``Proxy-Connection:''.

    Если HTTP-заголовок используется в условии, этот заголовок добавляется в заголовок Vary ответа в случае, если условие истинно для запроса. Он не добавляется, если условие ложно для запроса. Добавление HTTP-заголовка в заголовок Vary ответа необходимо для правильного кэширования.

    Следует учитывать, что условия следуют логике короткого замыкания в случае флага «ornext|OR», поэтому некоторые условия могут вообще не оцениваться.

  5. %{LA-U:variable} может использоваться для предварительного просмотра, который выполняет внутренний (основанный на URL) подзапрос для определения окончательного значения переменной. Это может быть использовано для доступа к переменной для перенаправления, которая недоступна на текущем этапе, но будет установлена на более поздней фазе.

    Например, для перенаправления в соответствии с переменной REMOTE_USER из контекста сервера (файл httpd.conf) необходимо использовать %{LA-U:REMOTE_USER} — эта переменная устанавливается фазами авторизации, которые выполняются после фазы преобразования URL (во время которой работает mod_rewrite).

    С другой стороны, поскольку mod_rewrite реализует свой контекст по каталогам (файл .htaccess ) через фазу Fixup API и поскольку фазы авторизации выполняются перед этой фазой, в этом контексте можно использовать просто %{REMOTE_USER}.

  6. %{LA-F:variable} может использоваться для выполнения внутреннего (основанного на имени файла) подзапроса для определения окончательного значения переменной. В большинстве случаев это то же самое, что и LA-U выше.

CondPattern — это шаблон условия, регулярное выражение, которое применяется к текущей TestString. TestString оценивается первым, прежде чем сопоставляться с CondPattern.

CondPattern обычно является регулярным выражением, совместимым с Perl, но доступен дополнительный синтаксис для выполнения других полезных проверок TestString:

  1. Вы можете добавить к строке шаблона символ '!' (восклицательный знак), чтобы инвертировать результат условия, независимо от типа используемого CondPattern.
  2. Вы можете выполнить лексикографическое сравнение строк:
    <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"
  3. Вы можете выполнить сравнение целых чисел:
    -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.
  4. Вы можете выполнить различные проверки атрибутов файлов:
    -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]
  5. Если 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, так как первые переопределяются. Использование RewriteOptions Inherit заставляет 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 может включать

  1. обратные ссылки ($N) на шаблон RewriteRule
  2. обратные ссылки (%N) на последний сопоставленный шаблон RewriteCond
  3. переменные сервера, как в строках условия проверки (%{VARNAME})
  4. вызовы функций сопоставления (${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$1http://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$1http://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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API