RewriteCond
None
Директива RewriteCond
определяет условия для какого-либо правила. Перед директивой
RewriteRule
располагаются одна или несколько директив
RewriteCond
. Следующее за ними правило преобразования используется только тогда, когда URI соответствует условиям этой
директивы и также условиям этих дополительных директив.
СравниваемаяСтрока строка которая может содержать следующие дополнительные конструкции в дополении к простому тексту:
-
RewriteRule обратные_связи: Это обратные связи вида
$N
RewriteRule
(единственной, следующей сразу за текущим набором директивRewriteCond
). -
RewriteCond обратные_связи: Это обратные связи вида
%N
RewriteCond
в текущем наборе условий. -
RewriteMap расширения: Это расширения вида
${mapname:key|default}
-
Переменные сервера: Это переменные вида
%{
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 (текстовый браузер), вы выдаете наименее навороченную страницу, без рисунков, таблиц и т.д. Если любой другой браузер, выдаете стандартную страницу.