Posted on

mod_rewrite, URL, hotlink

From ruseller

Рассмотрим 3 примера

  1. перенаправление 301
  2. дружественные URL
  3. запрет использования ссылок на изображения

mod_rewrite – модуль веб-сервера Apache для преобразования URL

Модуль mod_rewrite позволяет создавать правила манипулирования адресами URL. Например, вы можете вставить значение полученное из запрашиваемого URL в новый URL, организуя динамическое перенаправление URL. Или можно проверить переменные сервера, например, HTTP_USER_AGENT (тип браузера), и изменять URL только если используется какой-то браузер на какой-то платформе (Chrome на Android).

Для работы с mod_rewrite будем использовать файл .htaccess в корневой папке сайта.

Две главных команды:

RewriteEngine: Включает/выключает механизм mod_rewrite для текущего запроса.
RewriteRule: Описывает правило изменения адреса URL.

Пример 1: ошибка 404

для решения проблемы 404 Not found можно перенаправить запрос (301), сообщив всем клиентам о том, что страница изменила адрес. Поисковые машины при этом обновят свои индексы.

RewriteEngine on
RewriteRule ^my-old-url.html$ /my-new-url.html [R=301,L]

^my-old-url.html$ – регулярное выражение, которому соответствует адрес URL для изменения. Шаблон означает: “соответствует началу адреса URL (^), за которым следует текст ‘my-old-url.html’, за которым следует символ окончания URL ($).” В регулярном выражении символ точки (.) означает соответствие любому символу, поэтому нужно использовать обратный слэш, чтобы указать, что нам нужна именно точка (.).

/my-new-url.html – вторая часть правила RewriteRule, которая описывает на что нужно менять. В данном случае это просто /my-new-url.html.

[R=301,L]третья часть правила, которая содержит один или несколько флагов, помещенных в квадратные скобки. Флаги позволяют добавлять определенные опции или действия к правилу. В данном примере используется 2 флага: R=301 означает “использовать перенаправление 301 на новый адрес URL”; а L означает “последнее правило”, или другими словами “остановить процесс обработки URL, если он соответствует правилу “.

Пример 2: Человекопонятный УРЛ (ЧПУ)

Пусть есть скрипт show.php, выводящий статью. Работает он так:
http://www.site.com/show.php?p=pageid

Некрасиво. Так лучше будет:
http://www.site.com/pages/pageid

RewriteEngine on
RewriteRule ^pages/([^/]+)/?$ show.php?p=$1 [L]

^pages/([^/]+)/?$ – регулярное выражение, соответствующее любому URL в формате pages/(pageid)/. Оно гласит:”соответствует началу URL (^) , за которым следует текст pages/, за которым следует один или более символов, не являющиеся слэшем ([^/]+), за которыми может следовать слэш (/?), за которым следует символ окончания URL ($)”. Обратите внимание на круглые скобки вокруг части шаблона [^/]+. Таким образом текст, соответствующей данной части, например, “pageid”, сохраняется для дальнейшего использования.

show.php?p=$1 – данная часть правила указывает серверу Apache использовать скрипт show.php , которому передается текст, соответствующий подшаблону [^/]+ из регулярного выражения первой части (например, “pageid”), в качестве параметра p. $1 называется обратной связью и хранит текст соответствующий подшаблону. Если регулярное выражение содержит еще один подшаблон в круглых скобках, то соответствующий ему текст будет храниться в переменной $2, и так далее.

[L] – как и в предыдущем примере мы используем флаг для остановки дальнейшей обработки URL, чтобы не произошло изменение адреса другими правилами RewriteRule.

Пример 3: запрет использования ссылок на изображения на вашем сайте

пусть у нас есть фото по адресу www.site.com/photo.jpg. Другой сайт может его использовать так <img src=”http://www.site.com/photo.jpg” alt=”” />
Использует трафик нашего сервера, что не есть хорошо.

Файл .htaccess должен находиться в корне сайта или в папке с картинками
RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www.)?site.com/.*$ [NC]
RewriteRule .+.(gif|jpg|png)$ – [F]

RewriteCond %{HTTP_REFERER} !^$- RewriteCond является еще одной директивой mod_rewrite. Она позволяет устанавливать условие, которое должно выполняться для обработки URL следующим за ним правилом RewriteRule . В данном случае условием является наличие значения в переменной HTTP_REFERER.

RewriteCond %{HTTP_REFERER} !^http://(www.)?site.com/.*$ [NC] – вторая директива RewriteCond требует, чтобы значение переменной HTTP_REFERER не начиналось с http://www.site.com/ или http://site.com/ . Флаг [NC] устанавливает чувствительность к регистру символов.

RewriteRule .+.(gif|jpg|png)$ – [F] – если два выше предыдущих условия RewriteCond не выполняются, то правило пропускается. Само же правило возвращает ошибку “403 Forbidden” (используется флаг [F]), если URL содержит имя файла изображения (строка заканчивается на .gif, .jpg или .png), Тире в параметре подстановки означает “не надо заменять URL другим адресом”.

Leave a Reply

Your email address will not be published. Required fields are marked *