вторник, 5 февраля 2013 г.

Изменение адресов в .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.
[spoiler title="Некоторые правила PERL-совместимых регулярных выражений"]
Текст:
. любой символ
[ ] класс: [символы] любые символы класса, [^символы] любые символы кроме символов класса
| или: text1|text2 текст1 или текст2
^ начало строки, $ конец строки
Квалификаторы:
?    0 или 1 вхождение предыдущего символа или группы
*    0 или N вхождений  (N > 0)
+   1 или N вхождений (N > 1)
Группировка:
(текст) группа в левой части, которая в левой части  обозначается  $N (N - порядковый номер группы) (см. ниже пример 2),  или группировка для альтернативы text1|text2
Экранирование спецсимволов:
символ если нужно использовать символы, которые имеют специальное значение, такие как  . [ ] ( ) [/spoiler]
В строке замены могут использоваться текст, ссылки на подстроки из шаблона поиска и значения серверных переменных.
Серверные переменные в директивах модуля mod_rewrite записываются в формате
%{имя_переменной), где именем переменной может быть:
server_name – имя веб-сервера, например: www.сайт.ru
server_port – номер порта веб-сервера
document_root – каталог документов верхнего уровня для веб-сайта, например, /usr/host/mysite/html
[spoiler title="Некоторые другие серверные переменные"]
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 – текущее время
[/spoiler]

Условия

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

Примеры:

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

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

2. Преобразование сайт.ru/~username/ ->  сайт.ru/users/username/

...
RewriteRule /~([^/]+)?(/*)/ /users/$1/$2 [R]
Скобки ( ) в левой части обозначают группы по порядку, которые в правой части обозначены $1 и $2.

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

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

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

С 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]

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

Директивы файла robots.txt – это только рекомендации для роботов. Гарантированный запрет обеспечивают директивы в файле .htaccess, например:
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_USER_AGENT} ^robot
RewriteCond %{REMOTE_ADDR} ^196.56.78.18
RewriteRule ^(.*) for_bad_robots.php
Здесь проверяется имя robot, переданное в заголовке user-Agent, а затем IP-адрес, с которого робот пришел на сайт. Если оба условия выполняются, происходит запрос к странице for_bad_robots.php.
Источники:
http://itif.ru/htaccess-dly-zend-framework/
http://web.ixit.ru/pdf/apache/apache_config.pdf
Подробнее: http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html#rewriteoptions
Всего просмотров 2,593, сегодня 53
Запись опубликована в рубрике htaccess с метками , , , , . Добавьте в закладки постоянную ссылку.

Гость говорит:
Все хорошо в теории, а на практике зависит от настроек сервера...
Василий говорит:
Вопрос по файлу .htaccess:
Имеется сайт http://www.сайт.ru
в директории http://www.сайт.ru/dir - еще один сайт.
в директории http://www.сайт.ru/dir/forum - еще один сайт (форум).
Возможно ли используя файл или файлы .htaccess (имеющихся сайтов), сделать чтобы форум http://www.сайт.ru/dir/forum работал по адресу несуществующей директории http://www.сайт.ru/forum
Димитрис говорит:
да!
 

2 комментария:

  1. Печи для финской сауны.
    https://cyky.ru/pechi/pechi-dlya-finskoi-sauni/

    ОтветитьУдалить
  2. Помогите разобраться. Эта запись появилась в файле htaccess Сам файл в корне сайта

    php_flag register_globals On


    RewriteEngine On
    RewriteBase /
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /core.php [L]

    ОтветитьУдалить