Apache mod_rewrite
Модуль mod_rewrite является программным модулем веб сервера Apache (Важно! Он не будет выполняться под другими веб серверами!). Его первичная функция — манипуляция действий с URL. Модуль очень универсален и разносторонен.
Ниже показано несколько полезных примеров использования данного модуля для своего сайта.
Защищаем свой сайт
Предположим, что вы хотите защитить от несанкционированного доступа ваш файл .htaccess. На некоторых серверах Вы можете легко читать этот файл просто вводя URL следующего формата в поле адреса вашего браузера: http://www.feanor184.ru/.htaccess — серьезное упущение защиты, так как содержание вашего .htaccess может показать важную информацию об установках и настройках вашего сайта человеку, знающему как эти знания применить против вас. Чтобы блокировать этот доступ, запишем следующее:
RewriteRule ^.htaccess$ - [F]
Это правило переводится так: Если кто-то пробует обращаться к файлу .htaccess, система должна произвести код ошибки ‘HTTP response of 403’ или ‘403 Forbidden — You don’t have permission to access /.htaccess on this server’.
Конструкция ^.htaccess$ в этом регулярном выражении означает:
^ — якорь начала строки
$ — якорь конца строки
. — в регулярных выражениях точка ‘.’ обозначает мета-символ и должна быть защищена обратным слэшем (backslash), если Вы все-таки хотите использовать именно фактическую точку.
Имя файла должно быть расположено точно между начальным и конечным якорем. Это будет гарантировать то, что только это определенное имя файла и никакое другое, сгенерирует код ошибки. [F] — специальный ‘запрещающий’ флажок (forbidden).
Mod_rewrite открывает дороги к множеству тонкостей и нюансов web строительства.
Если Вы введете ‘www.feanor184.ru‘ в браузере, Вас перенаправит на ‘feanor184.ru‘. Так же можно организовать и обратный редирект. Для проделывания такой операции на Вашем сайте добавьте следующий код в файл .htaccess:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^feanor184\.ru$
RewriteRule (.*) http://www.feanor184.ru/$1 [R=301,L]
URL сайта, конечно же, поменяйте на свой. Редирект можно делать в любую сторону — по своему выбору(c www или без). Для чего делать такой редирект? Чтобы избежать дублирования сайта поисковиками с www и без www. Это очень желательно для поисковой оптимизации сайта.
Так же, с помошью mod_rewrite можно организовать перенаправление домена на новый поддомен или папку.
Допустим, Вы сделали редизайн на сайте и обновленный сайт находится в папке “new” в корне сайта. То есть новый сайт доступен по адресу “feanor184.ru/new”. Перенос файлов из одного места в другое может быть довольно трудоемким процесом, так что просто добавьте следующие строки в файл .htaccess и разместите его в корневой папке:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^feanor184\.ru$ [OR]
RewriteCond %{HTTP_HOST} ^www\.feanor184\.ru$
RewriteCond %{REQUEST_URI} !^/new/
RewriteRule (.*) /new/$1
Теперь при обращение к «www.feanor184.ru» все файлы будут браться из “feanor184.ru/new”
Синтаксис регулярных выражений
:^ | начало строки |
$ | конец строки |
. (точка) | любой символ |
(a|b) | a или b |
(…) | выбор группы |
[abc] | любой символ из диапазона (a или b или c) |
[^abc] | ни один символ из диапазона (ни a или b или c) |
a? | символ a 1 или 0 раз |
a* | символ a 0 или более раз |
a+ | символ a 1 или более раз |
a{3} | символ a точно 3 раза |
a{3,} | символ a более 3 раз |
a{3,6} | символ a от 3 до 6 раз |
!(pattern) | ! — отрицание |
Флаги RewriteRule
R[=code] | Перенаправление на новый URL по заданному коду |
F | Forbidden (отправляет заголовок 403) |
G | Больше не существует (Gone) |
P | Прокси (Proxy) |
L | Последнее правило |
N | Следующий |
C | Chain |
T=mime-type | Установка mime-type |
NS | Skip if internal sub-request |
NC | Не зависимый от регистра символов |
QSA | Append query string (Прибавляет строку запроса) |
NE | Не отменяет результат |
PT | Через |
S=x | Пропустить следующие x правил |
E=var:value | Устанавливает переменную окружения «var» в «value». |
Примеры mod_rewrite
# Сайт перенесен с одного домена на другой # с domain.com на domain2.com RewriteCond %{HTTP_HOST} ^www.domain.com$ [R=301,1] RewriteRule ^(.*)$ http://www.domain2.com/$1 |
|
# Страница временно перемещена # domain.com/page.htm на domain.com/new_page.htm RewriteRule ^page.htm$ new_page.htm [R,NC,L] |
|
# Человекопонятный URL (ЧПУ) # domain.com/category-name-1/ из domain.com/categories.php?name=category-name-1 RewriteRule ^([A-Za-z0-9-]+)/?$ categories/php?name=$1 [L] |
|
# Человекопонятный URL (ЧПУ) # domain.com/articles/title/5/ из domaim.com/articles.php?name=title$page=5 RewriteRule ^articles([A-Za-z0-9-]+) /([0-9]+)/?$ article.php?name=$1&page=$2 [L] |
|
# Блокирование спама по HTTP_REFERER RewriteCond %{HTTP_REFERER} (weight) [NC,OR] RewriteCond %{HTTP_REFERER} (drugs) [NC] RewriteRule .* — [F] |
RewriteCond FLAGS
NC | Не зависимый от регистра символов |
OR | Allows a rule to apply if one of a series of conditions are true |
Коды ответа сервера
301 | Moved permanently (Перемещен постоянно) |
302 | Moved temporarily (Перемещен временно) |
403 | Forbidden (Запрещено) |
404 | Not found (Файл не файден) |
410 | Gone (Больше не существует) |
Переменные сервера
Формат
%{NAME_OF_VAR}
HTTP Headers (заголовки)
HTTP_USER_AGENT
HTTP_REFERER
HTTP_COOKIE
HTTP_FORWARDED
HTTP_HOST
HTTP_PROXY_CONNECTION
HTTP_ACCEPT
Request (переменные запроса)
REMOTE_ADDR
REMOTE_HOST
REMOTE_USER
REMOTE_IDENT
REQUEST_METHOD
SCRIPT_FILENAME
PATH_INFO
QUERY_STRING
AUTH_TYPE
Server (переменные сервера)
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
Директивы
RewriteEngine
RewriteOptions
RewriteLog
RewriteLogLevel
RewriteLock
RewriteMap
RewriteBase
RewriteCond
RewriteRule
Даже не знал о таких функциях! Обязательно нужно будет попробовать!