О сайте | Карта сайта | Календарь сайта | Содержание
www.shtogrin.com  
Главная  //  Библиотека  //  Веб  //  Модуль mod_rewrite  //  Документация mod_rewrite  //  Директива RewriteCond

Директива RewriteCond

Описание: Определяет условие при котором происходит преобразование
Синтаксис: RewriteCond TestString CondPattern
Значение по умолчанию: None
Контекст: server config, virtual host, directory, .htaccess
Статус: Расширение
Модуль: mod_rewrite

Директива RewriteCond определяет условия для какого-либо правила. Перед директивой RewriteRule располагаются одна или несколько директив RewriteCond. Следующее за ними правило преобразования используется только тогда, когда URI соответствует условиям этой директивы и также условиям этих дополительных директив.

СравниваемаяСтрока строка которая может содержать следующие дополнительные конструкции в дополении к простому тексту:

  • RewriteRule обратные_связи: Это обратные связи вида

    $N

    (0 <= N <= 9) предоставляющие доступ к сгруппированным частям (в круглых скобках!) шаблона из соответствующей директивы RewriteRule (единственной, следующей сразу за текущим набором директив RewriteCond).
  • RewriteCond обратные_связи: Это обратные связи вида

    %N

    (1 <= N <= 9) предоставляющие доступ к сгруппированным частям (в круглых скобках!) шаблона из соответствующей директивы RewriteCond в текущем наборе условий.
  • 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
    Полный путь в файловой системе сервера к файлу или скрипту соответствующим этому запросу.

Специальные примечания:

  1. Переменные SCRIPT_FILENAME и REQUEST_FILENAME содержат одинаковые значения, т.е., значение поля filename внутренней структуры request_rec сервера Apache. Первое имя это просто широко известное имя переменной CGI в то время как второе это постоянная копия REQUEST_URI (содержащая значение поля uri структуры request_rec).
  2. Есть специальный формат: %{ENV:переменная} где переменная может быть любой переменной окружения. Это ищется во внутренних структурах Apache и (если там нет) с помощью вызова getenv() из процесса Apache сервера.
  3. Есть специальный формат: %{HTTP:заголовок} где заголовок может быть любым именем HTTP MIME-заголовка. Это ищется в HTTP запросе. Пример: %{HTTP:Proxy-Connection} значение HTTP заголовка Proxy-Connection: .
  4. Есть специальный формат %{LA-U:переменная} опережающих запросов которые производятся внутренним (основанном на URL) подзапросом для определения конечного значения переменной. Используйте это когда вы хотите использовать переменную для преобразований, которая реально определяется позднее, в  какой-либо фазе API, и таким образом недоступна на данном этапе. Для примера когда вы хотите преобразовать соответственно переменной REMOTE_USER из контекста сервера (файл httpd.conf) вы должны использовать %{LA-U:REMOTE_USER} потому что эта переменная устанавливается в фазах авторизации которые идут после фазы трансляции URL в которой и работает mod_rewrite. С другой стороны, по причине реализации работы mod_rewrite в  контексте каталога (файл .htaccess) через Fixup фазу API и из-за того, фазы авторизации идут до этой фазы, вы просто можете там использовать %{REMOTE_USER}.
  5. Есть специальный формат: %{LA-F:переменная} который создает внутренний (основанный на имени файла) подзапрос для определения конечного значения переменной. В основном это то же самое что и формат LA-U приведенный выше.

Условие это шаблон условия, т.е., какое-либо регулярное выражение применяемое к текущему экземпляру СравниваемаяСтрока, т.е., СравниваемаяСтрока просматривается на поиск соответствия Условие.

Помните: Условие это perl совместимое регулярное выражение с некоторыми дополнениями:

  1. Вы можете предварять строку шаблона префиксом '!' (восклицательный знак) для указания несоответствия шаблону.
  2. Есть некоторые специальные варианты Условие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 (текстовый браузер), вы выдаете наименее навороченную страницу, без рисунков, таблиц и т.д. Если любой другой браузер, выдаете стандартную страницу.


03.08.2007


2006-2024, Roman Shtogrin