Войти через VK Войти через FB Войти через Google Войти через Яндекс
Поиск по сайту
Директива RewriteCond
Описание: | Определяет условие при котором происходит преобразование |
---|---|
Синтаксис: | RewriteCond СравниваемаяСтрокаУсловие |
Значение по умолчанию: | None |
Контекст: | server configvirtual hostdirectory.htaccess |
Разрешение: | FileInfo |
Статус: | Расширение |
Модуль: | mod_rewrite |
Директива RewriteCond определяет условия для какого-либо правила. Перед директивой RewriteRule располагаются одна или несколько директив RewriteCond. Следующее за ними правило преобразования используется только тогда, когда URI соответствует условиям этой директивы и также условиям этих дополительных директив.
СравниваемаяСтрока строка которая может содержать следующие дополнительные конструкции вдополении к простому тексту:
- RewriteRule обратные_связи: Это обратные связи вида
$N
(0 <= N<= 9) предоставляющие доступ к сгруппированным частям (в круглых скобках!) шаблона из соответствующей директивы RewriteRule (единственной, следующей сразу затекущим набором директивRewriteCond
). - RewriteCond обратные_связи: Это
обратные связи вида
%N
(1 <= N<= 9) предоставляющие доступ ксгруппированным частям (в круглых скобках!) шаблона из соответствующей директивы RewriteCond втекущем наборе условий. - RewriteMap расширения: Это расширения вида
${mapname:key|default}
Смотрите документацию по RewriteMap для получения более подробной информации. - Переменные сервера: Это переменные вида
%{NAME_OF_VARIABLE
где NAME_OF_VARIABLE может быть строкой взятой из следующего списка:}
HTTP заголовки: соединение & запрос: HTTP_USER_AGENT
HTTP_REFERER
HTTP_COOKIE
HTTP_FORWARDED
HTTP_HOST
HTTP_PROXY_CONNECTION
HTTP_ACCEPTREMOTE_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_SOFTWARETIME_YEAR
TIME_MON
TIME_DAY
TIME_HOUR
TIME_MIN
TIME_SEC
TIME_WDAY
TIMEAPI_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 совместимое регулярное выражение с некоторыми дополнениями:
- Вы можете предварять строку шаблона префиксом ! (восклицательный знак) для указания несоответствия шаблону.
- Есть некоторые специальные варианты Условие.
Вместо обычных строк с регулярными выражениями можно также использовать
один из следующих вариантов:
- <Условие (лексически меньше)
Условие считается простой строкой и лексически сравнивается с СравниваемаяСтрока. Истинно если СравниваемаяСтрока лексически меньше чем Условие. - >Условие (лексически больше)
Условие считается простой строкой и лексически сравнивается с СравниваемаяСтрока. Истинно если СравниваемаяСтрока лексически больше чем Условие. - =Условие (лексически равно)
Условие считается простой строкой и лексически сравнивается с СравниваемаяСтрока. Истинно если СравниваемаяСтрока лексически равно Условие, т.е. эти две строки полностью одинаковы (символ всимвол). Если Условие имеет вид""
(два знака дюйма идущих подряд) это сравнивает СравниваемаяСтрока с пустой строкой. - -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]
.
Прокомментировать/Отблагодарить