что такое mod_rewrite и как его использовать? |
Описываются три практичных примера: перенаправление 301, создание дружественных URL и блокирование использования ссылок на изображения. mod_rewrite - это замечательный модуль веб сервера Apache. Он очень гибкий и может выполнять много полезных функций. Использование mod_rewrite может представлять определенные трудности для новичков по причине сложных синтаксиса и механизма обработки. Однако, стоит разобраться в нескольких базовых концепциях и можно будет эффективно использовать mod_rewrite для собственного сервера. В данном уроке мы научимся создавать несколько базовых правил mod_rewrite на реальных примерах, которые можно будет использовать для собственного сайта. Рекомендуется тщательно изучить материал о регулярных выражениях, если вы еще не знаете что это такое. Что такое mod_rewrite?mod_rewrite - это модуль сервера Apache для манипуляции (изменения) URL. Часто это означает получение запроса URL от посетителя и посылка ему содержания с другого URL. Например, посетитель вводит следующий URL в адресной строке браузера:
Обычно Apache отправляет обратно пользователю содержание файла
Важно понимать, что изменение адреса происходит внутри сервера Apache. Адресная строка браузера по прежнему будет показывать Хотя с помощью модуля mod_rewrite можно выполнять и перенеправление HTTP и еще много других функций, таких как возвращение кодов ошибки HTTP. Что можно делать с помощью mod_rewriteМодуль mod_rewrite позволяет создавать правила манипулирования адресами URL. Например, вы можете вставить значение полученное из запрашиваемого URL в новый URL, организуя динамическое перенаправление URL. Или можно проверить переменные сервера, например, HTTP_USER_AGENT (тип браузера), и изменять URL только если используется браузер, например, Safari, запущенный на iPhone. Вот несколько обычных функций, которые выполняет mod_rewrite:
Как использовать mod_rewriteДля использования mod_rewrite, нужно создать директивы Apache для указания модулю, что нужно делать. Директивы - это простые конфигурационные установки. Часто директивы размещаются в файле Две самых важных директивы mod_rewrite:
Вот простой пример. Создайте файл
В данном файле задаются следующие установки:
Если теперь открыть веб браузер и посетить страницу Если вы получаете ошибку 404, то вероятно на вашем хостинге не используется mod_rewrite. В данном случае надо обратиться к администратору хостинга. Как работает
|
1 |
RewriteRule Pattern Substitution [Optional Flags] |
Pattern
- регулярное выражение шаблона. Если URL соответствует шаблону, то правило выполняется. Иначе правило пропускается.Substitution
- новый URL, который будет использоваться вместо соответствующего шаблону адреса.[Optional Flags]
- один или несколько флагов, которые определяют поведение правила.
Вы можете добавить в файл .htaccess
столько правил RewriteRule
, сколько нужно. Модуль mod_rewrite проходит все правила каждый раз при запросе, обрабатывая соответствующие адресу URL.
Если правило изменяет запрашиваемый URL на новый адрес, то новый URL используется дальше при проходе по файлу .htaccess
, и может соответствовать другому правилу RewriteRule
, размещающемуся далее в файле. (Если нужно изменить такое поведение, то надо использовать флаг L
("последнее правило").)
Несколько примеров использования mod_rewrite
Самый простой способ объяснить mod_rewrite - показать его использование при решении практических задач.
Пример 1: исключение ошибки 404
Иногда происходит изменение URL страницы на вашем сайте. Такое может произойти в момент реорганизации содержания. Если поисковый механизм или другие сайты ссылаются на старый адрес URL, то пользователь получит ошибку "404 Not Found", когда он попробует воспользоваться ссылкой.
Для решения данной проблемы вы можете использовать модуль mod_rewrite для перенаправления 301. Таким образом заголовок HTTP отсылается любому браузеру, запросившему старый адрес URL, сообщая ему о том, что страница перемещена по новому адресу. Также поисковые механизмы информируются о том, что надо обновить индексы с новым адресом URL.
Следующий файл .htaccess
перенаправит запросы на новый адрес URL:
1 |
RewriteEngine on |
2 |
RewriteRule ^my-old-url.html$ /my-new-url.html [R=301,L] |
Правило RewriteRule
работает так:
^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: создание дружественных адресов URL
Допустим, вы написали PHP скрипт display_article.php
для вывода статей на вашем сайте. Вы можете ссылаться на статью с помощью следующего адреса URL:
1 |
http://www.example.com/display_article.php?articleId=my-article |
Данный адрес выглядит уродливо и запрос внутри него (?articleId=my-article
) может смущать некоторые поисковые механизмы. Гораздо лучше использовать адрес URL такого вида:
1 |
http://www.example.com/articles/my-article/ |
Вы можете задействовать mod_rewrite для преобразования ссылок второго формата в первый, что даст возможность использовать дружественные ссылки на страницах сайта, а обращение будет выполняться к реальным адресам, не видимым никому. Для этого файл .htaccess
, расположенный в корневой директории вашего сайта, должен содержать следующие строки:
1 |
RewriteEngine on |
2 |
RewriteRule ^articles/([^/]+)/?$ display_article.php?articleId=$1 [L] |
Описание правила RewriteRule
:
^articles/([^/]+)/?$ -
регулярное выражение, соответствующее любому URL в форматеarticles/(article ID)/
. Оно гласит:"соответствует началу URL (^
) , за которым следует текстarticles/
, за которым следует один или более символов, не являющиеся слэшем([^/]+)
, за которыми может следовать слэш(/?)
, за которым следует символ окончания URL($)
". Обратите внимание на круглые скобки вокруг части шаблона[^/]+
. Таким образом текст, соответствующей данной части, например,"my-article"
, сохраняется для дальнейшего использования.display_article.php?articleId=$1 -
данная часть правила указывает серверу Apache использовать скриптdisplay_article.php
, которому передается текст, соответствующий подшаблону[^/]+
из регулярного выражения первой части (например,"my-article"
), в качестве параметраarticleId
.$1
называется обратной связью и хранит текст соответствующий подшаблону. Если регулярное выражение содержит еще один подшаблон в круглых скобках, то соответствующий ему текст будет храниться в переменной$2,
и так далее.[L] -
как и в предыдущем примере мы используем флаг для остановки дальнейшей обработки URL, чтобы не произошло изменение адреса другими правиламиRewriteRule.
Выше приведенное правило RewriteRule
берет запрашиваемый URL в формате http://www.example.com/articles/my-article/
и преобразует его в URL вида http://www.example.com/display_article.php?articleId=my-article
.
Пример 3: предотвращаем использование ссылок на изображения на вашем сайте
Еще одной типовой задачей, которую решает использование модуля mod_rewrite, является предотвращение использования ссылок на изображения на вашем сайте другими веб проектами. Допустим, на вашем сайте есть страница http://www.example.com/mypage.html
, которая содержит следующий тег img
:
1 |
< img src = "myphoto.jpg" alt = "Моя фотография" /> |
Другой сайт может ссылаться на своих страницах прямо на вашу фотографию следующим образом:
1 |
< img src = "http://www.example.com/myphoto.jpg" alt = "Моя фотография" /> |
Это означает, что чужой сайт не только "заимствует" ваше изображение, но использует часть трафика вашего сервера для отображения изображения на своих страницах. И если чужой сайт имеет большой поток посетителей, то такое положение станет проблемой!
Вы можете использовать следующие директивы mod_rewrite для того, чтобы прекратить использование ссылок на изображения всеми другими сайтами, кроме вашего собственного. Разместите ниже приведенный код в файле .htaccess
в корневом каталоге вашего сайта или в папке с изображениями, которые надо защитить. Измените example.com
на имя вашего домена.
1 |
RewriteEngine on |
2 |
RewriteCond %{HTTP_REFERER} !^$ |
3 |
RewriteCond %{HTTP_REFERER} !^http://(www.)?example.com/.*$ [NC] |
4 |
RewriteRule .+.(gif|jpg|png)$ - [F] |
Как только вы закончите выполнять все операции копирования любой браузер , запрашивающий изображения с вашего сайта использующий при запросе URL, начинающийся с имени домена, отличного от www.example.com
или example.com
, будет получать ошибку "403 Forbidden". что остановит использование ссылок на ваши изображения на других сайтах.
Вот как работает данный набор правил:
RewriteEngine on -
включаем механизм mod_rewriteRewriteCond %{HTTP_REFERER} !^$
-RewriteCond
является еще одной директивой mod_rewrite. Она позволяет устанавливать условие, которое должно выполняться для обработки URL следующим за ним правиломRewriteRule
. В данном случае условием является наличие значения в переменнойHTTP_REFERER
.RewriteCond %{HTTP_REFERER} !^http://(www.)?example.com/.*$ [NC] -
вторая директиваRewriteCond
требует, чтобы значение переменнойHTTP_REFERER
не начиналось сhttp://www.example.com/
илиhttp://example.com/
. Флаг[NC]
устанавливает чувствительность к регистру символов.RewriteRule .+.(gif|jpg|png)$ - [F] -
если два выше предыдущих условияRewriteCond
не выполняются, то правило пропускается. Само же правило возвращает ошибку "403 Forbidden" (используется флаг[F]
), если URL содержит имя файла изображения (строка заканчивается на.gif
,.jpg
или.png
), Тире в параметре подстановки означает "не надо заменять URL другим адресом".
То есть весь набор правил в файле .htaccess
гласит, если переменная HTTP_REFERER
содержит значение, и оно не начинается на http://example.com/
или http://www.example.com/
, и запрашиваемый URL содержит имя файла изображения, то надо отказать запросу с ошибкой "403 Forbidden".
Заключение
В данном уроке мы провели введение в использование модуля сервера Apche mod_rewrite для манипулирования адресами URL. Рассмотренные три практических примера затрагивают лишь небольшую часть всех возможностей модуля. Более подробную информацию о mod-rewrite на русском языке можно найти
← Платежные плагины для Virtuemart | Убираем страницы материала во вкладки. → |
---|
Комментарии
Имеется вопрос. В данной статье был рассмотрен пример 301 редиректа, а именно:
1 RewriteEngine on
2 RewriteRule ^dummy.html$ http://www.google.com/ [R=301]
А как быть с категорией на сайте. То есть, чтобы редирект происходил с категории на сайте на какую-нибудь конкретную страницу сайта.
К примеру, с категории site.ru/primer на страницу site.ru/primer.html ?
Помогите нет доступа к админке а за последние сутки было внесено очень много изменений !
если не шаришь в этом, то не суйся особенно в движках различных!!!!!
RSS лента комментариев этой записи