• • •
Apache - httpd.conf - Log
 
• • •
Options - Order - Auth
 
• • •
ErrorDocument
 
• • •
AddType - MIME types
 
• • •
CharsetDefault - CharsetSourceEnc
 
• • •
Redirect - RedirectMatch
 
• • •
Mod_rewrite - RewriteCond
 
• • •
AddHandler - Pass(Set)Env
 
• • •
PHP - .htaccess
 
• • •
Дополнительный материал
 
Рекомендуем
 
RewriteCond Директива

RewriteCond Директива модуля Mod rewrite

Описание: Определяет условие при котором происходит преобразование

Синтаксис: 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 в текущем наборе условий.

Переменные сервера - это переменные вида %{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.

Например основные значение ПЕРЕМЕННЫХ СЕРВЕРА старого хостинга этого сайта были таковыми - Environment:

VariableValue
PATH /usr/local/bin:/usr/bin:/bin
UNIQUE_ID 3cuz8VLFg1EWWH9ViPQAOOAO
SCRIPT_URL /111.php
SCRIPT_URI http://htaccess.net.ru/111.php
HTTP_USER_AGENT Opera/9.81 (Windows NT 6.1; WOW64) Presto/2.12.388 Version/12.16
HTTP_HOST htaccess.net.ru
HTTP_ACCEPT text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/webp, image/jpeg, image/gif, image/x-xbitmap ...
HTTP_ACCEPT_LANGUAGE ru-RU,ru;q=0.9,en;q=0.8
HTTP_ACCEPT_ENCODING gzip, deflate
HTTP_COOKIE _rbu=13928955903379342623; phpbb3_9w8e3_u=5450; phpbb3_9w8e3_k=..................
HTTP_CONNECTION Keep-Alive
SERVER_SIGNATURE no value
SERVER_SOFTWARE Apache
SERVER_NAME htaccess.net.ru
SERVER_ADDR 83.192.131.81
SERVER_PORT 80
REMOTE_ADDR 129.71.205.45 - ip адрес компьютера посетителя
DOCUMENT_ROOT /
SERVER_ADMIN [no address given]
SCRIPT_FILENAME /home/www/htaccess.net.ru/111.php
REMOTE_PORT 57621
GATEWAY_INTERFACE CGI/1.1
SERVER_PROTOCOL HTTP/1.1
REQUEST_METHOD GET
QUERY_STRING (параметры запроса после знака ? т.е. из http://www.htaccess.net.ru/administrator/index.php?option=com_users&view=users берется "option=com_users&view=users")
REQUEST_URI /111.php - запрашиваемый адрес без домена
SCRIPT_NAME /111.php или если бы скрипт был запущен из RewriteCond.php расположенного в подпапке - то: "/doc/mod_rewrite/RewriteCond.php"

Что бы вы могли увидеть свои - а они у каждого сервера и домуента свои - необходимо например создать вот такой файлик info.php:


<?php
phpinfo () ;
?>

и после его исполнения - открытия браузером - ваш-домен.ру/info.php - найти в нем такую же табличку (см. ближе к концу):

Кстати, в веб программирование практически не заменимы значения таблицы "PHP Variables" представленной там же.


Большинство ПЕРЕМЕННЫХ документрованны в руководства или в спецификации 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 совместимое регулярное выражение с некоторыми дополнениями:

  • Вы можете предварять строку шаблона префиксом '!' (восклицательный знак) для указания несоответствия шаблону.

  • Есть некоторые специальные варианты Условиеs. Вместо обычных строк с регулярными выражениями можно также использовать один из следующих вариантов:

    '<Условие' (лексически меньше)

    Условие считается простой строкой и лексически сравнивается с СравниваемаяСтрока. Истинно если СравниваемаяСтрока лексически меньше чем Условие.

  • '>Условие' (лексически больше)

    Условие считается простой строкой и лексически сравнивается с СравниваемаяСтрока. Истинно если СравниваемаяСтрока лексически больше чем Условие.

  • '=Условие' (лексически равно)

    Условие считается простой строкой и лексически сравнивается с СравниваемаяСтрока. Истинно если СравниваемаяСтрока лексически равно Условие, т.е. эти две строки полностью одинаковы (символ в символ). Если Условие имеет вид "" (два знака дюйма идущих подряд) это сравнивает СравниваемаяСтрока с пустой строкой.

  • '-d' (является ли каталогом)

    СравниваемаяСтрока считается путем, проверяется существование этого пути и то что этот путь является каталогом.

  • '-f' (является ли обычным файлом)

    СравниваемаяСтрока считается путем, проверяется существование этого пути и то что этот путь является обычным файлом.

  • '-s' (является ли обычным файлом с ненулевым размером)

    СравниваемаяСтрока считается путем, проверяется существование этого пути и то что этот путь является обычным файлом, размер которого больше нуля.

  • '-l' (является ли символической ссылкой)

    СравниваемаяСтрока считается путем, проверяется существование этого пути и то что этот путь является символической ссылкой.

  • '-F' (проверка существования файла через подзапрос)

    Проверяет через все списки контроля доступа сервера, существующие в настоящий момент, является ли СравниваемаяСтрока существующим файлом, доступным по этому пути. Для этой проверки используется внутренний подзапрос, поэтому используйте эту опцию с осторожностью — это отрицательно сказывается на производительности сервера!

  • '-U' (проверка существования URL через подзапрос)

    Проверяет через все списки контроля доступа сервера, существующие в настоящий момент, является ли СравниваемаяСтрока существующим URL, доступным по этому пути. Для этой проверки используется внутренний подзапрос, поэтому используйте эту опцию с осторожностью — это отрицательно сказывается на производительности сервера!

    Замечание

    Все эти проверки также могут быть предварены префиксом восклицательный знак ('!') для инвертирования их значения.

  • Дополнительно вы можете устанавливать специальные флаги для Условие добавляя

    [flags]

    третьим аргументом в директиву RewriteCond. Flags список следующих флагов разделенных запятыми:

    а)) 'nocase|NC' (регистронезависимо)

    Регистр не имеет значение, т.е., нет различий между 'A-Z' и 'a-z' как в дополнении СравниваемаяСтрока так и Условие. Этот флаг эффективен только для сравнений между СравниваемаяСтрока и Условие. Он не работает при проверках в файловой системе и в подзапросах.

    б)) 'ornext|OR' (либо следующее условие)

Используйте для комбинирования условий в правилах OR (логическое ИЛИ) или / или AND - логическое "И". Но AND - подразумевается отсутсвием OR, т.е. AND не ставится, т.е. если нет OR, то значит что бы стработало правило нужно что бы совпали все правила последовательно - пример с "или":

RewriteCond %{REMOTE_HOST} ^host1.* [OR]

RewriteCond %{REMOTE_HOST} ^host2.* [OR]

RewriteCond %{REMOTE_HOST} ^host3.*

RewriteRule ...some special stuff for any of these hosts...

Без этого флага вы должны были бы написать это условие - правило три раза / а если бы не было бы "ИЛИ" то что бы правило сработало нужно что бы совпали все три входящих адреса, т.к. он всегда один - в обычном случае такого быть не может - просто варинат применения условий

Пример:

Запретим заход на сайт пользователям по методу GET и так же использующем кроме данного HTTP-метода (один из способов отправить или получить данные на/с сервер/а) и одновременно IP адрес ="95.31.94.72" (AND - нет, но если нет OR значит "И" считается- есть автоматом), сайт выдаст "Forbidden - You don't have permission to access this resource." - "Запрещено - у вас нет разрешения на доступ к этому ресурсу":

RewriteCond %{REQUEST_METHOD} GET [NC]

RewriteCond %{REMOTE_ADDR} 95.31.94.72 [NC]

#RewriteCond %{REMOTE_ADDR} 95\.31\.94\.72 [NC,OR] # так же рабочий вариант, закоммментирован значком # - не выполняется

#RewriteCond %{REMOTE_ADDR} ^(95\.31\.94|108\.76\.97|108\.76\.100) [NC,OR] # закоммментирован, блокируем сразу ТРИ подсети вида 95.31.94.(1-255)/...

# в случае синтаксической ошибке в коде .htaccess - сервер выдаст ошибку: "Internal Server Error" - для начала закомментируйте значком "#" строки со своими последними изменения #RewriteCond ... так сказать откатите изменения.

RewriteRule ^(.*)$ – [F,L]

HTTP-методы GET и POST — самые распространённые способы отправить или получить данные с сервер.

Пример:

Для выдачи главной страницы какого-либо сайта согласно «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]

Пример 2:

## Блокировка нежелательных "посетителей" - ботов для конкретного не новостного сайта:

RewriteCond %{HTTP_USER_AGENT} ^-?$ [NC,OR] # блокируем яндекс новости - не пускает яндекс новости

RewriteCond %{HTTP_USER_AGENT} News [NC,OR] # блокируем яндекс новости YandexNews

RewriteCond %{HTTP_USER_AGENT} Grabber [NC,OR] # работает и для для URLGrabber, т.е. для справа слева примышкающих символов тоже

RewriteCond %{HTTP_USER_AGENT} AhrefsBot [NC,OR] #сервис оптимизаторов для учета ссылок

RewriteCond %{HTTP_USER_AGENT} MJ12bot [NC,OR] #сервис оптимизаторов для учета ссылок

RewriteCond %{HTTP_USER_AGENT} xpymep [NC,OR] #спам утилита

RewriteCond %{HTTP_USER_AGENT} Baiduspider [NC,OR] #китайская поисковая система, а нужен ли ваш сайт в китае?

RewriteCond %{HTTP_USER_AGENT} SolomonoBot [NC,OR] #сервис solomono

RewriteRule ^(.*)$ – [F,L]

Данный материал взят с сайта http://www.egoroff.spb.ru/portfolio/apache/

Рекламная информация

Недавно освободившиеся домены с PR и ТИЦ:

Сервис http://reg.ru - крупнейшего хостинга и регистратора доменов позволяет подать заявку на регистрацию доменного имени, которое недавно было освобождено прежним Администратором. Освобожденные домены часто имеют высокие показатили ТИЦ и PR и могут быть интересны к приобретению.

Освобожденные домены .RU c ТИЦ:

Ваш скидочный 5% промокод при новой регистрации на REG.RU:


BCE5-81C9-2463-2224

Использовать промокод при оплате услуг сможет каждый из зарегистрировавшихся только один раз. Поэтому вначале добавляем в корзину все что нужно, а затем одной операцией вводим купон и проводим оплату.

Rotaban.ru - биржа баннерной рекламы

Объем информации: 4350 bytes
Россия • [email protected] 2005 - 2023 •


 
  http://dmoz.org/World/Russian/Компьютеры/Интернет/Дизайн_и_разработка_сайтов/Веб-строительство/Ресурсы_вебмастера/