Начнем с основного, а именно с определения забугорных букв, сложившихся в слово 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:
Данный URL выглядит некрасиво и запрос (?exapleId=my-example) может вызывать недоумение у поисковых механизмов. Лучше использовать URL следующего вида:
Преобразовать 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:
Любой другой ресурс может позаимствовать вашу картинку:
Можно сделать вывод, что частично трафик вашего сервера используется ресурсом, стащившим вашу картинку для отображения картинки на своей странице. Это может стать проблемой, если у стороннего сайта большой трафик.
Чтобы избежать таких проблем, в файле .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
Важно помнить то, что RewriteRule не обрабатывает аргументы, которые не переданы в скрипт, имя сайта, ссылку, кстати, тоже обрабатывает не всю, если .htaccess лежит не в корне. Для этого существует другой модуль.
Пример того, как делать не надо
RewriteRule ^/index.php$ /my-index.php – начинается с /
RewriteRule ^example.com/.* http://www.semantica.in – RewriteRule не анализирует название сайта
RewriteRule index.php\?newspage=([0-9]+) news.php?page=$1 in – аргументы не попадают в RewriteRule
Вот, что из себя представляет htaccess RewriteRule. Надеюсь, было полезно