English

Blog

RewriteCond

Categories: Web Development

RewriteCond является расширением модуля mod_rewrite используемого в htaccess. Директива RewriteCond определяет условия для какого-либо правила, при котором происходит преобразование.

Синтаксис: RewriteCond «проверяемое выражение» «условие» «флаги»

Проверяемое выражение

Проверяемое выражение — это строка, состоящая из обычных символов, макросов или переменных.

Макросы

Макросы: $1, $2 и так далее — ссылаются на соответствующие выражения в скобках из текущей или следующей по порядку директивы RewriteRule.

Макросы: %1, %2 и так далее — ссылаются на выражения в скобках из текущей или предыдущей по порядку директивы RewriteCond.

Так же макросы %1, %2 и так далее могут использоваться в директиве RewriteRule для ссылки на предыдущую директиву RewriteCond.

Пример использования макросов: редирект с «без www» на «www» в htaccess:

RewriteCond %{HTTP_HOST} !^www\.(.*) [NC]
RewriteRule ^(.*)$ http://www.%1/$1 [R=301,L]

Переменные записываются в виде %{NAME_OF_VARIABLE}. Наиболее часто используются следующие переменные:

  • QUERY_STRING

    (параметры запроса);

  • REMOTE_ADDR

    (IP-адрес посетителя);

  • REMOTE_HOST

    (имя хоста посетителя);

  • REMOTE_USER

    (имя пользователя, если он прошел авторизацию);

  • REMOTE_METHOD

    (обычно GET либо POST);

  • PATH_INFO

    (путь к файлу веб-страницы);

  • HTTP_USER_AGENT

    (содержимое User-Agent http-заголовка);

  • HTTP_REFERER

    (содержимое Referer http-заголовка);

  • HTTP_COOKIE

    (содержимое Cookie http-заголовка);

  • HTTP_HOST

    (отдаёт «имя хоста веб-сайта: порт» если порт 80, то он не выводится);

  • TIME_YEAR

    (переменные вида TIME_* хранят разбитые на части текущие дату и время);

  • TIME_MON

    (месяц);

  • TIME_DAY

    (день);

  • TIME_HOUR

    (час);

  • TIME_MIN

    (минута);

  • TIME_SEC

    (секунда);

  • TIME_WDAY

    (день недели);

  • REQUEST_URI

    (строка запроса без имени хоста и параметров запроса);

  • REQUEST_FILENAME

    (имя файла из REQUEST_URI);

  • THE_REQUEST

    (полная строка запроса в том виде, в котором ее присылает браузер посетителя);

  • HTTP: «Название-Заголовка»

    (проверять содержимое любого http-заголовка).

Все переменные можно вывести для удобства на экран через php:

print_r($_SERVER); 

Легко можно определить ip пользователя:

echo ($_SERVER[REMOTE_ADDR]);

и настроить доступы к сайту только с определенного ip, а по всем остальным выдавать заглушку. Или настроить доступ в админку сайта только из своего дома.

Ваш ip:
204.236.226.210

Или можно получить ответ браузера пользователя:

echo ($_SERVER[HTTP_USER_AGENT]);

Можно написать простенькую функцию определения браузера и в зависимости от браузера отдавать разные css файлы. Банить роботов. Использовать это для крипты.

Ваш браузер отдал такую строку:
ia_archiver (+http://www.alexa.com/site/help/webmasters; crawler@alexa.com)

Пример: бан бесполезных роботов, которых мы не хотим пускать на сайт:

RewriteCond %{HTTP_USER_AGENT} ^.*msn [OR]
RewriteCond %{HTTP_USER_AGENT} ^.*Twiceler [OR]
RewriteCond %{HTTP_USER_AGENT} ^.*Slurp [OR]
RewriteCond %{HTTP_USER_AGENT} ^.*WebAlta [OR]
RewriteCond %{HTTP_USER_AGENT} ^.*psbot [OR]
RewriteCond %{HTTP_USER_AGENT} ^.*Mail.Ru [OR]
RewriteCond %{HTTP_USER_AGENT} ^.*HTMLParser [OR]
RewriteCond %{HTTP_USER_AGENT} ^.*Wget
RewriteRule ^.* - [F,L]

Условие

Условие — это обычное регулярное выражение. Кроме регулярных выражений существует еще несколько видов условий (условию может предшествовать символ !, который трактуется как отрицание):

  • =xy значение переменной должно быть лексически равно строке xy;
  • >xy — должно быть лексически больше строки xy;
  • -d — должен существовать каталог, имя которого совпадает со значением переменной;
  • -f — должен существовать файл, имя которого совпадает со значением переменной;
  • -s — должен существовать файл ненулевой длины, имя которого совпадает со значением переменной;
  • -l — должен существовать симлинк, имя которого совпадает со значением переменной;
  • -F — должен существовать файл, имя которого совпадает со значением переменной, и этот файл должен быть доступен по внешней ссылке на данный веб-сайт;
  • -U — должна быть доступна http-ссылка, имя которой совпадает со значением переменной.

Пример настройка 404 ошибки в htaccess:

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ...перенаправление куда-нибудь...

Флаги

Флаг — не обязательный параметр. Для RewriteCond флагов может быть всего два:

[NC] — (отключение проверки регистра аналогично флагу для директивы RewriteRule).

[OR] — (объединение директив RewriteCond по ИЛИ).

Пример в htaccess:

RewriteCond %{REMOTE_HOST}  ^host1.*  [OR]
RewriteCond %{REMOTE_HOST}  ^host2.*  [OR]
RewriteCond %{REMOTE_HOST}  ^host3.*
RewriteRule ...перенаправление куда-нибудь...