| Директива RewriteCond
Description: | Defines a condition under which rewriting will take place
|
Syntax: | RewriteCond
TestString CondPattern [flags] |
Context: | server config, virtual host, directory, .htaccess |
Override: | FileInfo |
Status: | Extension |
Module: | mod_rewrite |
Директива RewriteCond определяет условие правила. Один или несколько RewriteCond
могут предшествовать RewriteRule
директиве. Затем следующее правило используется только в том случае, если текущее состояние URI соответствует его шаблону и выполняются эти условия.
TestString — это строка, которая может содержать следующие расширенные конструкции в дополнение к обычному тексту:
-
Обратные ссылки RewriteRule : это обратные ссылки в форме
(0 <= N <= 9). От $1 до $9 обеспечивают доступ к сгруппированным частям (в скобках) шаблона, из которых
действует текущий набор условий. $0 обеспечивает доступ ко всей строке, соответствующей этому шаблону.
$N RewriteRule RewriteCond
-
Обратные ссылки RewriteCond : это обратные ссылки в форме
(0 <= N <= 9). От %1 до %9 обеспечивают доступ к сгруппированным частям (опять же в скобках) шаблона, начиная с последнего совпадения
в текущем наборе условий. %0 предоставляет доступ ко всей строке, соответствующей этому шаблону.
%N RewriteCond
-
Расширения RewriteMap : Это расширения формы . См. документацию для RewriteMap для более подробной информации.
${mapname:key|default}
-
Server-Variables : это переменные формы
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 HTTP-сервера Apache или
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
- Будет содержать текст «включено», если соединение использует SSL/TLS, или «выключено» в противном случае. (Эту переменную можно безопасно использовать независимо от того,
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 внутренней
request_rec структуры 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} , где header может быть любым именем HTTP MIME-заголовка, всегда можно использовать для получения значения заголовка, отправленного в HTTP-запросе. Пример: %{HTTP:Proxy-Connection} значение HTTP-заголовка `` Proxy-Connection: ''.
Если заголовок HTTP используется в условии, этот заголовок добавляется к заголовку Vary ответа на случай, если условие оценивается как истинное для запроса. Он не добавляется, если условие оценивается как ложное для запроса. Добавление заголовка HTTP к заголовку Vary ответа необходимо для правильного кэширования.
Следует иметь в виду, что условия следуют логике короткого замыкания в случае флага ' ', так что некоторые условия могут вообще не оцениваться. ornext|OR
-
%{LA-U:variable}
может использоваться для опережающего просмотра, который выполняет внутренний (на основе URL) подзапрос для определения конечного значения переменной . Это можно использовать для доступа к переменной для перезаписи, которая недоступна на текущем этапе, но будет установлена на более позднем этапе.
Например, для перезаписи в соответствии с
REMOTE_USER переменной из контекста сервера ( apache2.conf файла), которую вы должны использовать %{LA-U:REMOTE_USER} , эта переменная устанавливается фазами авторизации, которые идут
после фазы преобразования URL (во время которой работает mod_rewrite).
С другой стороны, поскольку mod_rewrite реализует свой контекст для каждого каталога ( .htaccess файл) через фазу исправления API и поскольку фазы авторизации предшествуют этой фазе, вы просто можете использовать
%{REMOTE_USER} в этом контексте.
-
%{LA-F:variable} может использоваться для выполнения внутреннего (на основе имени файла) подзапроса, чтобы определить окончательное значение переменной . В большинстве случаев это то же самое, что и LA-U выше.
CondPattern — это шаблон условия, регулярное выражение, которое применяется к текущему экземпляру TestString .
TestString сначала оценивается, а затем сопоставляется с
CondPattern .
CondPattern обычно является
Perl-совместимым регулярным выражением , но есть дополнительный синтаксис для выполнения других полезных тестов для Teststring :
- Вы можете поставить перед строкой шаблона
! символ ' ' (восклицательный знак), чтобы отменить результат условия, независимо от того, какой тип CondPattern используется.
-
Вы можете выполнять лексикографические сравнения строк:
- <CondPattern
- Лексикографически предшествует
Обрабатывает CondPattern как простую строку и сравнивает его лексикографически с TestString . True, если
TestString лексикографически предшествует
CondPattern .
- >CondPattern
- Лексикографически следует
Обрабатывает CondPattern как простую строку и сравнивает его лексикографически с TestString . True, если
TestString лексикографически следует за
CondPattern .
- =CondPattern
- Лексикографически равный
Обрабатывает CondPattern как простую строку и сравнивает его лексикографически с TestString . Истина, если
TestString лексикографически равна
CondPattern (две строки точно равны, символ за символом). Если CondPattern
( "" две кавычки), это сравнивает TestString с пустой строкой.
- <=CondPattern
- Лексикографически меньше или равно
Обрабатывает CondPattern как обычную строку и лексикографически сравнивает его с TestString . Истина, если TestString лексикографически предшествует
CondPattern или равна CondPattern
(две строки равны, символ за символом).
- >=CondPattern
- Лексикографически больше или равно
Обрабатывает CondPattern как простую строку и сравнивает его лексикографически с TestString . Истинно, если TestString лексикографически следует за
CondPattern или равен CondPattern
(две строки равны, символ за символом).
-
Вы можете выполнять целочисленные сравнения:
- -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
- Является символической ссылкой .
Рассматривает 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
в качестве третьего аргумента к
директиве, где flags — это список, разделенный запятыми, любого из следующих флагов: [ ] RewriteCond
Пример:
Чтобы переписать главную страницу сайта в соответствии с User-Agent: заголовком запроса, вы можете использовать следующее:
RewriteCond "%{HTTP_USER_AGENT}" "(iPhone|Blackberry|Android)"
RewriteRule "^/$" "/homepage.mobile.html" [L]
RewriteRule "^/$" "/homepage.std.html" [L]
Объяснение: если вы используете браузер, который идентифицирует себя как мобильный браузер (обратите внимание, что пример неполный, так как существует множество других мобильных платформ), обслуживается мобильная версия домашней страницы. В противном случае обслуживается стандартная страница.
|
|