RewriteCond
None
Директива RewriteCond определяет условия для какого-либо правила. Перед директивой
RewriteRule располагаются одна или несколько директив
RewriteCond. Следующее за ними правило преобразования используется только тогда, когда URI соответствует условиям этой
директивы и также условиям этих дополительных директив.
СравниваемаяСтрока строка которая может содержать следующие дополнительные конструкции в дополении к простому тексту:
-
RewriteRule обратные_связи: Это обратные связи вида
(0 <= N <= 9) предоставляющие доступ к сгруппированным частям (в круглых скобках!) шаблона из соответствующей директивы$NRewriteRule(единственной, следующей сразу за текущим набором директивRewriteCond). -
RewriteCond обратные_связи: Это обратные связи вида
(1 <= N <= 9) предоставляющие доступ к сгруппированным частям (в круглых скобках!) шаблона из соответствующей директивы%NRewriteCondв текущем наборе условий. -
RewriteMap расширения: Это расширения вида
Смотрите документацию по RewriteMap для получения более подробной информации.${mapname:key|default} -
Переменные сервера: Это переменные вида
где NAME_OF_VARIABLE может быть строкой взятой из следующего списка:%{NAME_OF_VARIABLE}HTTP заголовки: соединение & запрос: HTTP_USER_AGENT
HTTP_REFERER
HTTP_COOKIE
HTTP_FORWARDED
HTTP_HOST
HTTP_PROXY_CONNECTION
HTTP_ACCEPT
REMOTE_ADDR
REMOTE_HOST
REMOTE_USER
REMOTE_IDENT
REQUEST_METHOD
SCRIPT_FILENAME
PATH_INFO
QUERY_STRING
AUTH_TYPE
внутренние сервера: системные: специальные: DOCUMENT_ROOT
SERVER_ADMIN
SERVER_NAME
SERVER_ADDR
SERVER_PORT
SERVER_PROTOCOL
SERVER_SOFTWARE
TIME_YEAR
TIME_MON
TIME_DAY
TIME_HOUR
TIME_MIN
TIME_SEC
TIME_WDAY
TIME
API_VERSION
THE_REQUEST
REQUEST_URI
REQUEST_FILENAME
IS_SUBREQ
Эти переменные полностью соответствуют названным похожим образом MIME-заголовкам HTTP , Си переменным сервера Apache или полям
struct tmсистем Unix. Большинство из них документрованны в других местах руководства или в спецификации CGI. Те, что являются для mod_rewrite специальными включают:IS_SUBREQ- Будет содержать текст "true" если запрос выполняется в текущий момент как подзапрос, "false" в другом случае. Подзапросы могут быть сгенерированны модулями которым нужно иметь дело с дополнительными файлами или URI для того чтобы выполнить собственные задачи.
API_VERSION- Это версия API модуля Apache (внутренний интерфейс между сервером и модулем) в текущей сборке сервера, что определено в include/ap_mmn.h. API версия модуля соответствует используемой версии Apache (для версии Apache 1.3.14, к примеру это 19990320:10), однако это в основном интересно авторам модулей.
THE_REQUEST-
Полная строка HTTP запроса отправленная браузером серверу (т.е., "
GET /index.html HTTP/1.1"). Она не включает какие-либо дополнительные заголовки отправляемые браузером. REQUEST_URI- Ресурс, запрошенный в строке HTTP запроса. (В примере выше, это было бы "/index.html".)
REQUEST_FILENAME- Полный путь в файловой системе сервера к файлу или скрипту соответствующим этому запросу.
Специальные примечания:
-
Переменные SCRIPT_FILENAME и REQUEST_FILENAME содержат одинаковые значения, т.е., значение поля
filenameвнутренней структурыrequest_recсервера Apache. Первое имя это просто широко известное имя переменной CGI в то время как второе это постоянная копия REQUEST_URI (содержащая значение поляuriструктурыrequest_rec). -
Есть специальный формат:
%{ENV:переменная}где переменная может быть любой переменной окружения. Это ищется во внутренних структурах Apache и (если там нет) с помощью вызоваgetenv()из процесса Apache сервера. -
Есть специальный формат:
%{HTTP:заголовок}где заголовок может быть любым именем HTTP MIME-заголовка. Это ищется в HTTP запросе. Пример:%{HTTP:Proxy-Connection}значение HTTP заголовка "Proxy-Connection:". -
Есть специальный формат
%{LA-U:переменная}опережающих запросов которые производятся внутренним (основанном на URL) подзапросом для определения конечного значения переменной. Используйте это когда вы хотите использовать переменную для преобразований, которая реально определяется позднее, в какой-либо фазе API, и таким образом недоступна на данном этапе. Для примера когда вы хотите преобразовать соответственно переменнойREMOTE_USERиз контекста сервера (файлhttpd.conf) вы должны использовать%{LA-U:REMOTE_USER}потому что эта переменная устанавливается в фазах авторизации которые идут после фазы трансляции URL в которой и работает mod_rewrite. С другой стороны, по причине реализации работы mod_rewrite в контексте каталога (файл.htaccess) через Fixup фазу API и из-за того, фазы авторизации идут до этой фазы, вы просто можете там использовать%{REMOTE_USER}. -
Есть специальный формат:
%{LA-F:переменная}который создает внутренний (основанный на имени файла) подзапрос для определения конечного значения переменной. В основном это то же самое что и формат LA-U приведенный выше .
Условие это шаблон условия, т.е., какое-либо регулярное выражение применяемое к текущему экземпляру СравниваемаяСтрока, т.е., СравниваемаяСтрока просматривается на поиск соответствия Условие.
Помните: Условие это perl совместимое регулярное выражение с некоторыми дополнениями:
- Вы можете предварять строку шаблона префиксом '
!' (восклицательный знак) для указания несоответствия шаблону. -
Есть некоторые специальные варианты Условиеs. Вместо обычных строк с регулярными выражениями можно также использовать один из следующих
вариантов:
-
'<Условие' (лексически меньше)
Условие считается простой строкой и лексически сравнивается с СравниваемаяСтрока. Истинно если СравниваемаяСтрока лексически меньше чем Условие. -
'>Условие' (лексически больше)
Условие считается простой строкой и лексически сравнивается с СравниваемаяСтрока. Истинно если СравниваемаяСтрока лексически больше чем Условие. -
'=Условие' (лексически равно)
Условие считается простой строкой и лексически сравнивается с СравниваемаяСтрока. Истинно если СравниваемаяСтрока лексически равно Условие, т.е. эти две строки полностью одинаковы (символ в символ). Если Условие имеет вид""(два знака дюйма идущих подряд) это сравнивает СравниваемаяСтрока с пустой строкой. -
'-d' (является ли каталогом)
СравниваемаяСтрока считается путем, проверяется существование этого пути и то что этот путь является каталогом. -
'-f' (является ли обычным файлом)
СравниваемаяСтрока считается путем, проверяется существование этого пути и то что этот путь является обычным файлом. -
'-s' (является ли обычным файлом с ненулевым размером)
СравниваемаяСтрока считается путем, проверяется существование этого пути и то что этот путь является обычным файлом, размер которого больше нуля. -
'-l' (является ли символической ссылкой)
СравниваемаяСтрока считается путем, проверяется существование этого пути и то что этот путь является символической ссылкой. -
'-F' (проверка существования файла через подзапрос)
Проверяет через все списки контроля доступа сервера, существующие в настоящий момент, является ли СравниваемаяСтрока существующим файлом, доступным по этому пути. Для этой проверки используется внутренний подзапрос, поэтому используйте эту опцию с осторожностью - это отрицательно сказывается на производительности сервера! -
'-U' (проверка существования URL через подзапрос)
Проверяет через все списки контроля доступа сервера, существующие в настоящий момент, является ли СравниваемаяСтрока существующим URL, доступным по этому пути. Для этой проверки используется внутренний подзапрос, поэтому используйте эту опцию с осторожностью - это отрицательно сказывается на производительности сервера!
Замечание
Все эти проверки также могут быть предварены префиксом восклицательный знак ('!') для инвертирования их значения. -
'<Условие' (лексически меньше)
Дополнительно вы можете устанавливать специальные флаги для Условие добавляя
[flags]
третьим аргументом в директиву RewriteCond. Flags список следующих флагов разделенных запятыми:
-
'
nocase|NC' (регистронезависимо)
Регистр не имеет значение, т.е., нет различий между 'A-Z' и 'a-z' как в дополнении СравниваемаяСтрока так и Условие. Этот флаг эффективен только для сравнений между СравниваемаяСтрока и Условие. Он не работает при проверках в файловой системе и в подзапросах. -
'
ornext|OR' (либо следующее условие)
Используйте для комбинирования условий в правилах OR вместо AND. Типичный пример:Без этого флага вы должны были бы написать это условие/правило три раза.RewriteCond %{REMOTE_HOST} ^host1.* [OR] RewriteCond %{REMOTE_HOST} ^host2.* [OR] RewriteCond %{REMOTE_HOST} ^host3.* RewriteRule ...some special stuff for any of these hosts...
Пример:
Для выдачи главной страницы какого-либо сайта согласно "User-Agent:" заголовку запроса, вы можете использовать следующие директивы:
RewriteCond %{HTTP_USER_AGENT} ^Mozilla.*
RewriteRule ^/$ /homepage.max.html [L]
RewriteCond %{HTTP_USER_AGENT} ^Lynx.*
RewriteRule ^/$ /homepage.min.html [L]
RewriteRule ^/$ /homepage.std.html [L]
Интерпретация: Если у вас Netscape Navigator (который идентифицируется как 'Mozilla'), вы выдаете максимально навороченную страницу, с фреймами, и т.д. Если у вас Lynx (текстовый браузер), вы выдаете наименее навороченную страницу, без рисунков, таблиц и т.д. Если любой другой браузер, выдаете стандартную страницу.