Apache mod_rewrite

Январь27

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

Поделиться в соц. сетях

Метки: ,
Copyright © 2013-2017. All rights reserved.

Опубликованно Январь 27, 2014 by Feanor184 в категории Web

Об Авторе

Постигаю Linux, учу Python, пытаюсь программировать)

1 комментарий(ев) к записи “Apache mod_rewrite

Оставьте комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*

=

Перед тем, как оставить комментарий, убедитесь, что вы ознакомились с правилами комментирования этого блога.