






- • Директива модуля - 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:
Variable | Value |
---|---|
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: Использовать промокод при оплате услуг сможет каждый из зарегистрировавшихся только один раз. Поэтому вначале добавляем в корзину все что нужно, а затем одной операцией вводим купон и проводим оплату. |

