Мы работаем не только в Моcкве, но и в других городах России:

Продвижение по трафику от 50 копеек за переход. Заказать

Что такое RewriteRule и для чего он нужен

Подписаться
Больше интересностей из блога студии SEMANTICA
Получайте эффективные советы по интернет-рекламе и SEO-оптимизации вашего сайта
ВКонтакте:
Facebook:
Twitter:
htaccess mod rewrite

Начнем с основного, а именно с определения забугорных букв, сложившихся в слово mod_rewrite.

mod_rewrite – является модулем сервера Apache, он служит для разнообразной манипуляции над URL.

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

К примеру, пользователь вводит: //semantica.in/blog/redirekt-navodit-porjadci-bnmvx.html

Можно предположить, что Apache отправит пользователю обратно содержание файла redirekt-navodit-porjadci-bnmvx.html. Но благодаря Apache mod_rewrite можно отправить данные с другого файла, например:

//semantica.in/blog/lajfkhak-dlya-magazina-avtomaticheskaya-generacziya-i-optimizacziya-metategov.html

Изменение адреса происходит внутри сервера Apache.

Визуально URL в браузере никак не изменится, он останется таким же, как и был //semantica.in/blog/redirekt-navodit-porjadci-bnmvx.html. Но содержание будет с другой страницы. В этом и заключается отличие от перенаправления HTTP, которое показывает URL страницы информатора.

Хотя благодаря модулю mod_rewrite можно включить перенаправление HTTP, а также много других полезных функций.

 

 

Самые жирные функции, которые можно реализовать с помощью mod_rewrite

1. Создание «Дружественных» URL адресов, которые используются для маскировки «кривых» URL

При написании скрипта example.php, например, для вывода статей, вы можете оформить ссылку на статью, используя такой URL:

//semantica.in/example.php?exapleId=my-example

Данный URL выглядит некрасиво и запрос (?exapleId=my-example) может вызывать недоумение у поисковых механизмов. Лучше использовать URL следующего вида:

http:// semantica.in/example/my-example/

Преобразовать URL в таком случае нам поможет mod_rewrite. Что нам нужно сделать? В корне сайта находится файл .htaccess, допишем в него:

RewriteEngine on
RewriteRule ^articles/([^/]+)/?$ example.php?exampleId=$1 [L]

Теперь рассмотрим правило RewriteRule подробнее:

  • ^articles/([^/]+)/?$ — регулярное выражение, имеющее соответствие с любым URL адресом в формате articles/ (articleID)/. Оно подразумевает: "соответствие началу URL адреса, за которым будет текст (articles/), вслед за которым будет один или много символов, предшествующих слэшу ([^/]+), за которыми будет следовать собственно слэш (/?), за которым будет символ окончания URL ($)".
  • example.php?exampleId=$1 – эта часть говорит серверу использовать скрипт example.php , которому отправляется текст, соответствующий подшаблону [^/]+ из регулярного выражения.
  • [L] — Флаг для прекращения последующей обработки этого URL адреса.

 

2. Блокировка возможности использования ссылок в изображениях на сайте

Также модуль mod_rewrite может запретить использовать ссылки на изображения. Допустим, существует страница вашего сайта //semantica.in/page.html, в которой содержится такой тег img:

<img src="hoto.jpg" alt="фотография" />

Любой другой ресурс может позаимствовать вашу картинку:

<img src="//semantica.in/photo.jpg" alt="фотография" />

Можно сделать вывод, что частично трафик вашего сервера используется ресурсом, стащившим вашу картинку для отображения картинки на своей странице. Это может стать проблемой, если у стороннего сайта большой трафик.

Чтобы избежать таких проблем, в файле .htaccess дописываем:

 

RewriteEngine on

RewriteCond %<HTTP_REFERER> !^$

RewriteCond %<HTTP_REFERER> !^http://(www.)?semantica.in/.*$ [NC]

RewriteRule .+.(gif|jpg|png)$ - [F]

Разберем как работает этот код:

  • RewriteEngine on — включаем mod_rewrite
  • RewriteCond %<HTTP_REFERER> !^$- RewriteCond — директива mod_rewrite. Директива устанавливает условие, которое выполняется для обработки URL следующим правилом RewriteRule. В нашем случае условием будет значение в переменной HTTP_REFERER.
  • RewriteCond %<HTTP_REFERER> !^http://(www.)?semantica.in/.*$ [NC] — вторая директива ставит условие — значение переменной HTTP_REFERER не должно начинаться с http://www.semantica.in/ или //semantica.in/. [NC] — флаг устанавливает чувствительность к регистру символов.
  • RewriteRule .+.(gif|jpg|png)$ - [F]— правило пропускается, если два условия RewriteCond не выполнены. Само же правило возвращает ошибку "403 Forbidden"

 

3. Исключение ошибки 404 в период реорганизации сайта

При реорганизации содержания сайта, возможно изменение URL страницы. В этом случае, в выдаче новый URL появится через какое-то время. Получается, что при переходе по старой ссылке из выдачи поисковика или какого-нибудь ссылающегося сайта, пользователь увидит ошибку 404.

Здесь нам опять поможет модуль Apache mod_rewrite, предназначенный для реализации 301 редиректа. HTTP отсылает браузеру старый адрес, информируя, что у страницы новый адрес URL.

Необходимо дописать в файл .htaccess:

RewriteEngine on
RewriteRule ^semantica.html$ /new_semantica.html [R=301,L]

 

Далее рассмотрим подробнее как работает правило RewriteRule в этом случае:

  • ^semantica.html$ — регулярное выражение, значению которого соответствует старый адрес URL страницы. Значение шаблона: "соответствует началу адреса (^), за которым будет текст ' semantica.html', за которым будет символ окончания адреса ($)."
  • /new_semantica.html — вторая часть описывает, на какое выражение нужно менять. В нашем случае это /new_semantica.html.
  • [R=301,L] — используется 2 флага: R=301 означает "301 редирект на новый URL"; L – флаг для прекращения последующей обработки этого URL адреса.

 

 

Разберем подробнее как работает mod_rewrite

Итак, вы поняли (надеюсь), что такое mod_rewrite. Теперь самое время познакомится с директивой RewriteRule.  Эта директива может встречаться много раз, и каждый раз будет определять новое правило преобразования.

Чтобы понять как работает RewriteRule, необходимо знать с чем он работает. Для этого рассмотрим, как Apachе получает строку, которая передается на обработку RewriteRule в .htaccess.

Поначалу кажется, что mod_rewrite работает с ссылками, но в случае mod_rewrite htaccess это не так. 

На самом деле в RewriteRule передается не ссылка, а путь к файлу.

Из-за своей внутренней архитектуры сервер Apache в момент, когда работает .htaccess, mod_rewrite, может манипулировать путем файла, который должен быть обработан. Это происходит из-за других модулей, которые могли изменить запрос до передачи в модульПоэтому в mod_rewrite передается абсолютный путь файла. А также модуль знает путь до .htaccess в котором заданы правила RewriteRule. Для того чтобы из пути сделать ссылку, модуль отрезает от абсолютного пути часть до .htaccess.

Путь, от которого отрезан .htaccess, передается в первый rewriteRule. Пример:

  • Запрос: //semantica.in/wp-content/themes/semantica/i/sidebar/logo.png
  • Documentroot: /var/www/semantica.in
  • Путь файла: /var/www/semantica.in/wp-content/themes/semantica/i/sidebar/logo.png
  • Путь .htaccess: /var/www/semantica.in/ wp-content/.htaccess
  • В первый RewriteRule передается: themes/semantica/i/sidebar/logo.png

 

^DECFEE028CD4EFD64C5182C8F82BE47B14B1E74BA57B03833A^pimgpsh_fullsize_distr

 

Важно помнить то, что RewriteRule не обрабатывает аргументы, которые не переданы в скрипт, имя сайта, ссылку, кстати, тоже обрабатывает не всю, если .htaccess лежит не в корне. Для этого существует другой модуль.

Пример того, как делать не надо

RewriteRule ^/index.php$ /my-index.php – начинается с /

RewriteRule ^example.com/.* http://www.semantica.inRewriteRule не анализирует название сайта

RewriteRule index.php\?newspage=([0-9]+) news.php?page=$1 in – аргументы не попадают в RewriteRule

 

Вот, что из себя представляет htaccess RewriteRule. Надеюсь, было полезно

Задать вопрос по статье
Подпишись на нашу группу в VK и получай экспертные статьи прямо в ленту!

Мы работаем не только в Моcкве, но и в других городах России: