Справочники, инструменты, документация

htaccess: Изменение адресов RewriteCond и RewriteRule

Что означают строчки с RewriteCond и RewriteRule в файле .htaccess?

Это директивы (инструкции) преобразования адресов для PHP Zend Framework модуля mod_rewrite. Использование директив модуля mod_rewrite увеличивает нагрузку на сервер!

# Описание инструкции (комментарий до конца строки)
RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]

Включение изменения ссылок: RewriteEngine on

Базовый URL для преобразований в каталоге: RewriteBase /

RewriteCond задает условие выполнения преобразований:

REQUEST_FILENAME – полный путь к файлу или скрипту из запроса

-s файл с ненулевым размером:

RewriteCond %{REQUEST_FILENAME} -s [OR]

или -l символическая ссылка:

RewriteCond %{REQUEST_FILENAME} -l [OR]

или -d каталог:

RewriteCond %{REQUEST_FILENAME} -d

RewriteRule задает правило преобразований:

  • ^ - начало строки
  • $ - конец строки
  • . - любой одиночный символ
  • * - ноль или N предшествующих символов (N > 0)
  • nocase|NC - не учитывать регистр
  • last|L - последнее правило

Правила

RewriteRule шаблон_поиска строка_замены [флаги]

В шаблоне поиска записывается регулярное выражение для поиска в запрашиваемом URL.

Текст

  • . - любой символ
  • [ ] - класс: [символы] любые символы класса, [^символы] любые символы кроме символов класса
  • | - или: text1|text2 текст1 или текст2
  • ^ - начало строки, $ конец строки

Квалификаторы

  • ? - 0 или 1 вхождение предыдущего символа или группы
  • * - 0 или N вхождений (N > 0)
  • + - 1 или N вхождений (N > 1)

Группировка

  • (Текст) - группа в левой части, которая в левой части обозначается $N (N - порядковый номер группы), или группировка для альтернативы text1|text2.

Экранирование спецсимволов

  • Если нужно использовать символы, которые имеют специальное значение, такие как . [ ] ( ).
  • В строке замены могут использоваться текст, ссылки на подстроки из шаблона поиска и значения серверных переменных.
  • Серверные переменные в директивах модуля mod_rewrite записываются в формате %{имя_переменной), где именем переменной может быть:
    • server_name – имя веб-сервера, например: www.сайт.ru
    • server_port – номер порта веб-сервера
    • document_root – каталог документов верхнего уровня для веб-сайта, например, /usr/host/mysite/html
    • http_forwarded – переадресованная ссылка
    • http_host – имя компьютера веб-сервера
    • http_referer – адрес страницы, с которой выполняется переход на текущую страницу
    • http_user_agent – веб-клиент, который запросил текущую страницу
    • remote_addr – IP-адрес посетителя
    • remote_host – имя компьютера посетителя
    • request_method – метод запроса при обращении к текущей странице
    • script_filename – физический путь к запрошенной странице, например: /usr/host/mysite/html/page.php
    • query_string – параметры запроса к странице, например, id=3&parent=4
    • request_uri – запрошенный URL. Содержит строку запроса после имени сервера, например, /company/test.php?id=3&parent=4
    • request_filename – то же самое, что и request_uri
    • time_year – текущий год, time_mon – месяц, time_day– день
    • time_hour – час, time_min – минута, time_sec – секунда
    • time_wday – день недели, time – текущее время

Условия

RewriteCond контрольная_строка шаблон_поиска [флаги]

Если шаблон поиска найден в контрольной строке (условие выполнено), выполняются директивы, указанные сразу за директивой RewriteCond, или управление переходит к следующему блоку директив.

Скрытое и видимое преобразование

RewriteEngine on
RewriteBase /
RewriteRule ^oldpage.html$ newpage.html [R]

Запрос страницы oldpage.html преобразуется в запрос к странице newpage.html, причем если не указан флаг [R], это будет незаметно посетителю (в адресной строке останется oldpage.html)!

Преобразование

сайт.ru/~username/ -> сайт.ru/users/username/

RewriteRule /~([^/]+)?(/*)/ /users/$1/$2 [R]

Скобки ( ) в левой части обозначают группы по порядку, которые в правой части обозначены $1 и $2.

Преобразование в зависимости от типа браузера

RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_USER_AGENT} Opera
RewriteCond %{REQUEST_FILENAME} server.ru/$|server.ru/index.php
RewriteRule ^(.*) index_opera.php?%{QUERY_STRING} [L]
RewriteCond %{HTTP_USER_AGENT} Netscape13
RewriteCond %{REQUEST_FILENAME} server.ru/$|server.ru/index.php
RewriteRule ^(.*) index_netscape.php?%{QUERY_STRING} [L]

Если выполнено первое условие RewriteCond - наличие в заголовке HTTP_USER_AGENT подстроки Opera -, проверяется следующее условие - запрос файла index.php или к корню сайта server.ru без указания имени файла. Если и это условие выполняется, выдается файл для браузера Opera – index_opera.php. (Флаг [L] означает окончание выполнения директив.) Если же первое условие не выполнено, управление переходит на следующий блок, который начинается с условия RewriteCond %{HTTP_USER_AGENT} Netscape и все происходит аналогично для браузера семейства Netscape.

Преобразование в зависимости от времени суток

С 7:00 до 19:00 дневной файл page_day.php, а в остальное время ночной файл page_night.php:

RewriteEngine On
RewriteBase /
RewriteCond %{TIME_HOUR}%{TIME_MIN} >0700
RewriteCond %{TIME_HOUR}%{TIME_MIN} <1900
RewriteRule ^page.php$ page_day.php?%{QUERY_STRING} [L]
RewriteRule ^page.php$ page_night.php?%{QUERY_STRING} [L]

Запрет для конкретного робота

Директивы файла robots.txt – это только рекомендации для роботов. Гарантированный запрет обеспечивают директивы в файле .htaccess, например:

RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_USER_AGENT} ^robot
RewriteCond %{REMOTE_ADDR} ^196.56.78.18
RewriteRule ^(.*) for_bad_robots.php