Этот модуль отслеживает две дополнительные (нестандартные) переменные
окружения CGI/SSI называемые
SCRIPT_URL и SCRIPT_URI. Они содержат
логическое представление текущего ресурса, т.е. то, каким вы видите это
в адресной строке браузера, в то время как стандартные переменные CGI/SSI SCRIPT_NAME и
SCRIPT_FILENAME содержат физическое или системное
представление.
Замечание: эти переменные содержат URI/URL в том виде, в котором они
были первоначально запрошены, т.е., перед тем как были
сделаные какие-либо преобразования. Это важно, ибо процесс преобразования
в первую очередь используется для преобразования логических URL в физические пути к конкретным
файлам.
Пример
SCRIPT_NAME=/sw/lib/w3s/tree/global/u/rse/.www/index.html
SCRIPT_FILENAME=/u/rse/.www/index.html
SCRIPT_URL=/u/rse/
SCRIPT_URI=http://en1.engelschall.com/u/rse/
Имеется и Руководство
по преобразованиям URL,
содержащее коллекцию практических решений проблем URL преобразований. Там можно найти
наборы правил взятые из реальной жизни и дополнительную информацию о
mod_rewrite.
Описание: |
Устанавливает базовый URL для преобразований в контексте каталога |
Синтаксис: |
RewriteBase URL-path |
Значение по умолчанию: |
Смотри использование для более подробной информации. |
Контекст: |
directory.htaccess |
Разрешение: |
FileInfo |
Статус: |
Расширение |
Модуль: |
mod_rewrite |
Директива RewriteBase устанавливает конкретный,
базовый URL для
преобразований в контексте каталога. Как вы увидите ниже, RewriteRule
может быть использовано в конфигурационных файлах каталогов
(.htaccess). Это будет работать локально, т.е., префикс
локального каталога отбрасывается на этом этапе обработки и ваши правила
преобразований работают только в оставшейся части. В конце он автоматически
добавляется обратно к пути. Настройка по-умолчанию; RewriteBase physical-directory-path
Когда, для какого-нибудь нового URL происходит подстановка(преобразование),
этот модуль должен заново вовлечь этот URL в обработку. Для того чтобы иметь
возможность сделать это, нужно знать какие у него префикс или база URL. По-умолчанию этот префикс равен
самому пути. Однако на большинстве сайтов URL'ы НЕ прямо соответствуют
физическим путям, поэтому это допущение обычно окажется неверным!
В этом случае вы должны использовать директиву RewriteBase для
указания правильного префикса URL.
Если URL
вашего сервера
не соответствуют физическим путям к файлам,
вы должны использовать
RewriteBase в каждом
из
.htaccess файлов где вы хотите использовать директивы
RewriteRule.
Например, предположим следующий конфигурационный файл каталога:
#
# /abc/def/.htaccess -- конфигурационный файл каталога /abc/def
# Помните: /abc/def это физический путь /xyz, т.е., у сервера есть
# директива 'Alias /xyz /abc/def' к примеру
#
RewriteEngine On
# даем серверу знать что мы работаем через /xyz а не
# через префикс физического пути /abc/def
RewriteBase /xyz
# теперь правила преобразований
RewriteRule ^oldstuff.html$ newstuff.html
В примере выше, запрос к /xyz/oldstuff.html корректно
преобразуется в физический файл /abc/def/newstuff.html.
Для любителей поковыряться в Apache
Следующий список дает подробную информацию об этапах внутренней работы:
Запрос:
/xyz/oldstuff.html
Внутренняя работа:
/xyz/oldstuff.html -> /abc/def/oldstuff.html (per-server Alias)
/abc/def/oldstuff.html -> /abc/def/newstuff.html (per-dir RewriteRule)
/abc/def/newstuff.html -> /xyz/newstuff.html (per-dir RewriteBase)
/xyz/newstuff.html -> /abc/def/newstuff.html (per-server Alias)
Результат:
/abc/def/newstuff.html
Это кажется очень сложным однако это корректная внутренняя работа Apache,
из-за того что преобразования в контексте каталога происходят слишком поздно в
этом процессе. Поэтому, когда это происходит (преобразование), запрос должен
быть возвращен обратно ядру Apache! НО: В то время как это кажется серъёзным
накладным расходом, в действительности это не так, потому что этот возврат
происходит целиком внутри сервера Apache и та же самая процедура используется
многими другими операциями внутри Apache. Поэтому, вы можете быть уверены что
дизайн и реализация правильные.
Описание: |
Определяет условие при котором происходит преобразование |
Синтаксис: |
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_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 (текстовый браузер), вы выдаете наименее
навороченную страницу, без рисунков, таблиц и т.д. Если любой другой
браузер, выдаете стандартную страницу.