• 👓 Инструкция

Что такое Rewriterule

  • 17 октября 2021
  • 20 мин.

Очень часто владельцам сайтов требуется перенаправлять посетителей с разных адресов на определенную страницу. Это может быть связано с различными причинами, но чаще всего просто остается неиспользованный домен, который нужно пристроить. Так, например, ведется реклама какого-либо товара и вам нужно по клику на определенную ссылку перенаправить его на новый адрес или вовсе передать контент с главного сайта. Можно попросить администратора хостинга, чтобы тот сделал базу данных общей для обоих сайтов, но как быть с выделенным сервером? Здесь придется действовать самостоятельно, используя mod_rewrite сервера Apache. Он входит в состав правил RewriteRule, обеспечивающих вебмастеров большими возможностями.

Лого Apache modrewrite

Возникает рациональный вопрос: а что это такое, собственно говоря? Это специальный модуль сервера Apache, который позволяет выполнять какие-либо действия с URI. Но главной его задачей является перенаправление одного адреса на страницу с другим с целью привлечения большего количества посетителей на конкретную страницу. Модуль обеспечивает веб-мастеров большими функциональными возможностями. Программа обеспечивает оперативную обработку данных, гарантируя максимальное быстродействие.

Особенности модуля

Модуль mod_rewrite представляет собой программу, которая выполняется на сервере. Она содержит в своем составе синтаксический анализатор URI. Его особенность состоит в том, что он позволяет применять регулярные выражения, а также в его возможности входит использование разных источников данных при выполнении анализа ссылки. По факту программа может использовать несколько серверов или окружений, извлекая нужную информацию по определенным признакам. Например, HTTP-заголовки или даже запросы из других баз, используя при этом разные форматы.

Примеры использования .htaccess

С помощью правил RewriteRule пользователь получает возможность выполнять разные действия с URI:

  • Изучить синтаксис его написания, разобрав на части.
  • Сравнить отдельные части с данными из внешних источников или из базы сервера Apache, в зависимости от ситуации.
  • Выполнить преобразование URI в соответствии с заранее заданными параметрами.
  • При необходимости можно сгенерировать часть строки URI.

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

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

Если перенаправление URI было только внутренним, то посетитель сайта не заметит, что был перенаправлен на другую страницу. Более того, не изменится и ссылка в адресной строке. Она будет выглядеть статической. Сервер апачи работает очень быстро при обязательном соблюдении всех правил его использования RewriteRule. Фактически клиент указывал один адрес, а получил ответ от другого. Данный метод актуален для тех сайтов, в которых перенаправления реализованы в рамках одной базы данных со ссылкой в PHP на главную страницу index.php.

Существует еще один способ выполнения перенаправления посетителя. Это можно выполнить при помощи изменения ссылки непосредственно в браузере пользователя. В таком случае осуществляется отправка кода заголовка и называется эта функция redirect. Существует единая система кодов, каждый из которых определяет конкретные функции модуля. Например, код 301 Moved Permanently является ничем иным, как постоянной перенаправления.

Как было сказано ранее, можно выполнять перенаправление, в том числе, и на внешние сайты и внутренне прокси-серверы. Правилами RewriteRule предусмотрено множество действий, которые должны выполняться в результате перенаправления. Одним из них является запрет на выдачу нужных данных — например, в случае необходимости их временного сокрытия от распространения. Поведение ссылок задается специальными флагами, каждый из которых задает определенный порядок действий.

Редирект 301 изображение

Важные моменты

Любые правила строятся на определенных постулатах. Так происходит и с модулем mod_rewrite, так как многие вебмастера считают его запутанным. На самом деле все достаточно просто, если часто применять знания на практике. Чтобы легче и быстрее освоить все функции программы, необходимо запомнить несколько важных моментов:

  1. Модуль умеет работать только с полными ссылками (обязательно должен быть включен path-info). Полный адрес должен присутствовать везде. По сути. все выглядит так: если файл .htaccess расположен в корне и применяются директивы именно из него, то ссылка должна содержать путь к корневой папке на сервере.
  2. Директива RewriteRule указывает на то, что правило преобразования адресов также является и условием, которое необходимо соблюдать в обязательном порядке. Синтаксис указанной директивы прямо указывает на то, каким условиям должен соответствовать URI. Важно понимать, что под правилами имеется в виду выражение, которое будет выполняться при обработке адреса. Вернее было бы назвать его алгоритмом, по которому будет осуществляться преобразование. Стоит понимать, что даже при запуске алгоритма или правила, не всегда будет достигнут нужный результат. Это связано с тем, что промежуточные данные далеко не всегда соответствуют условиям. А чтобы алгоритм был запущен, необходимо полное соответствие ссылки.
  3. Директивой RewriteRule также предусмотрены дополнительные условия. Они вызываются другой директивой — RewriteCond. Количество условий не ограниченно, поэтому их может быть несколько. На этом моменте обычно у всех наступает ступор, потому что происходит разрыв шаблона. Они задействуются в ходе выполнения правила или алгоритма, когда будет запущен основной алгоритм. Конечное преобразование будет выполнено по отношению к URI, если будут выполнены и дополнительные условия. Также важно знать еще один нюанс: прописывать условия к директиве RewriteCond следует перед основными правилами. Многим новичкам такая запись покажется нелогичной, и это немудрено, но она была создана именно в таком порядке.
  4. Текущее представление URI. Речь идет о ссылке, которая уже была преобразована определенными правилами, то есть, до изменения или уже после. Преобразование ссылки осуществляется последовательно от правила к правилу при соблюдении их условий, поэтому адрес будет последовательно изменяться.
  5. Расположение правил RewriteRule должно быть верным и имеет большое значение. Здесь следует понимать, что правила (алгоритмы) располагаются именно в последовательности осуществляемых преобразований ссылки. В противном случае преобразование будет выполнено неверно в любом случае и конечный URI не будет соответствовать заданному. Преобразование происходит в зависимости от последовательности правил, строчка за строчкой. Если адрес не отвечает текущим условиям правила, то оно не выполняется, а происходит переход к следующему и так далее. Соответственно, можно задать несколько конечных ссылок для отправки посетителя на разные сайты при выполнении определенных условий, указанных в цепочке.
  6. Логика отработки алгоритмов в директиве RewriteRule четко выстроена. Сначала осуществляется поиск условий, которые будут выполняться после отработки основного правила. Если дополнительных условий нет, то запускается последовательная обработка основных правил. Если они есть, после отработки основных правил apache направляет на дополнительные при выполнении их условий. При этом они выполняются именно в том порядке, в котором были перечислены в директиве RewriteCond. Здесь имеется важный момент. Преобразование URI будет выполнено только в том случае, если он будет соответствовать всем дополнительным условиям, потому что они объединены оператором AND по умолчанию. Если необходимо, то программист может изменить алгоритм, допустим, сделав так, чтобы выполнялось одно из условий. Для этого достаточно изменить оператор на OR.
  7. Mod Apache позволяет изменять алгоритм действия над URI после выполнения правила, указанного в директиве RewriteRule. Пользователь получает возможность при помощи расстановки соответствующих флагов отказать в выдаче нужных данных или перенаправить на другой адрес.
  8. Mod_rewrite является неотъемлемой частью Apache, поэтому его можно использовать при любых конфигурациях системы. У пользователя есть возможность записать конфигурацию на глобальном уровне или через директиву в главном конфигураторе. Также допускаются записи в подключаемых конфигурациях на виртуальном хосте путем добавления директив. Кроме этого, возможна и запись конфигурации в каталоге через директивы.
Механизм текущего и переписанного url

Исходя из сказанного, можно построить схему работы алгоритма преобразования URI от начала до получения результата. Она изображена на рисунке.

Построение синтаксиса директивы RewriteRule

Как и любой другой язык программирования, директива RewriteRule требует соблюдения определенного синтаксиса. В общем виде выражение выглядит следующим образом:

Директива RewriteRule

В файле данная строка будет выглядеть так:

Пример RewriteRule в файле

На рисунке использованы следующие поля:

  1. RewriteRule — на этом месте находится название используемой директивы.
  2. Шаблон — здесь прописывается условие, которое должно соответствовать URI. Если оно выполняется, то запускается правило. В данном случае используются GET-параметры, которые применяются к URI без query string.
  3. Подстановка — здесь прописывается правило изменения адреса.
  4. Флаг — это управляющий параметр, который имеется в используемой директиве.

В параметре Подстановка для RewriteRule или Сравнимая Строка для RewriteCond нужно указывать номер подвыражения, который проставляется в формате %N или $N.

Чтобы оперировать методами преобразования ссылок, нужно ознакомиться с возможными вариантами. Так, в примере в операторе Шаблон указана последовательность символов, которая нам говорит о следующем. Если после анализа выяснится, что захваченная скобками часть отвечает условию, то она будет сохранена в переменную $1.

В следующем операторе формируется строка из постоянного значения (до знака «/») и из переменного $1.

Указанный флаг в примере задает команду остановки любых преобразований. Если требуется добавить его в конец нового адреса, то параметр должен содержать строку «’qsappend|QSA’». Если начальный адрес содержит query string с GET-параметрами, то эта часть просто отбрасывается apache и не учитывается в дальнейшем при составлении нового адреса.

При составлении правил и условий в директиве RewriteCond также используются определенные переменные, задающие формат строки. Она может быть с GET-параметрами или с доменным именем. Их формат содержится в описании правил директивы. Параметр условия обычно содержит PB. Во флаге указывается принцип работы логики. Условия можно объединять операторами AND и OR, в зависимости от условий преобразования адресной строки.

Существующие переменные параметра флаг

Как правило, поле всегда предваряется строкой http:// thishost[:thisport]. Особенность преобразования состоит в том, что mod_rewite ее отсекает. Данная опция весьма полезна при формировании новых URI. Но при выполнении внешнего редиректа может стать настоящей проблемой. Для ее решения необходимо проставлять флаг [R]. Помимо данного параметра, также можно использовать ряд дополнительных.

redirect|R[=code]

Эта команда выполняет вызов редиректа. Если в Подстановке имеется ранее указанный префикс, то осуществляется запуск внешнего перенаправления. В противном случае будет выдан статус 302, который говорит нам о временном перемещении. При необходимости можно использовать все поле кодов от 300 до 400, вводя их непосредственно числовым значением. В этом случае следует использовать следующие имена:

  • temp;
  • permanent;
  • seeother.

Данный метод применим для выполнения преобразования виртуальных адресов в реальные. Также с его помощью можно добавлять слеш.

forbidden|F

Если использовать такое значение параметра флаг, то произойдет запрет на преобразование ссылки. Он обычно применяется для блокировки в директиве RewriteConds, когда используются дополнительные особые критерии сравнения.

gone|G

Если текущая ссылка не существует, то с помощью этого аргумента ее можно объявить мертвой. Далее она больше не будет преобразовываться. Пользователю будет отправлен HTTP со статусом 410. Можно удалить из базы несуществующие страницы или объявить их мертвыми.

proxy|P

Отработка этого оператора приведет к вызову прокси-модуля, при этом запрос помечается внутренним. Для его применения требуется рабочий прокси-модуль, который должен быть установлен на сервер Apache. Проверить его наличие достаточно легко. Для этого необходимо обратить внимание на строчку mod_proxy.c. Если она имеется, то Апачи поддерживает данный модуль.

last|L

Это последний алгоритм, который будет отрабатываться. Если он будет установлен в качестве параметра, то следующие правила не будут выполняться. Он имеет именно такое написание в языке Perl, или break — на языке C. Этот оператор рекомендуется использовать при преобразовании корневого адреса в действительный.

Также существуют и другие параметры:

  • next|N — перезапуск преобразования;
  • chain|C — команда является связкой между правилами;
  • type|T — принудительное преобразование типов MIME в MIME;
  • nosubreq|NS — команда на отключение регистра;
  • qsappend|QSA — команда добавления в строку запроса;
  • noescape|NE — запрещает mod_write экранирование обычных правил;
  • passthrough|PT — позволяет обрабатывать вывод директив RewriteRule другими директивами, например такими, как Alias или Redirect.

Необходимо помнить, что условия директивы RewriteCond указываются перед условиями RewriteRule. Это важно, так как в противном случае они выполняться не будут.

Формат команды в директиве дополнительных правил имеет вид:

Команда RewriteCond

Пример строки с заданными параметрами будет выглядеть так:

Пример строки RewriteCond

Если требуется указать несколько условий, которые должны проверяться по отношению к текущему URI, то в параметре flags указывается тип оператора. Напомним, он может быть логическим И или ИЛИ в зависимости от ожидаемого после преобразования результата. Mod Apache подразумевает проверку адресных строк на ряд совпадений. А именно, строка анализируется и выясняется, не является ли она файлом стилей или программой сценариев. Эти проверки нужны для того, чтобы исключить ошибки в преобразовании, из-за которых могут теряться различные данные в базе.

Пример указания нескольких условий и их объединения одним из двух операторов рассматривать не будем, так как все и так предельно понятно.

Ниже представлен полный листинг файла .htaccess, в котором прописываются обсуждаемые директивы.

Пример файла .htaccess

Как видно из примера, в последнем блоке имеется директива RewriteRule. В ней указан флаг [F]. Он говорит нам о том, что ничего делать не нужно, если адрес имеет окончание, указанное в скобках в этой строке.

Напомним, что существует несколько способов перенаправления:

  1. Простой редирект. Его особенность состоит в том, что допускается применение только с директивой RewriteRule.
  2. Внутренний Rewrite.
  3. Редирект и использованием GET-параметров.
  4. Перенаправление с полной версии сайта на мобильную. Он осуществляется путем замены всего содержимого в скобках на строку с указанием множества дополнительных переменных.

Чем отличается mod_rewrite в .htaccess и в VirtualHost?

Если вы используете VirtualHost, то нужно понимать, что с ним директива RewriteRule работает несколько иначе. Отличия между ними состоят в следующем:

  • В первую очередь отличие состоит в том, что используется вся строка от слеша до GET-параметров. При этом строка всегда начинается со слеша «/».
  • При указании второго аргумента RewriteRule также проставляется слеш.
  • Если в контексте .htaccess RewriteBase имеет значение, то в VirtualHost — нет.
  • Все правила выполняются единожды, а если стоит флаг [L], то происходит остановка всех алгоритмов преобразования.

Пример составления регулярных выражений

При составлении решения нужно максимально минимизировать вероятность активации на другой запрос. Вот несколько рекомендаций:

  • Составляя строки выражений, обязательно проставляйте символ «^». Так apache будет знать, что это начало строки. А в конце всегда стоит символ «$», который указывает на окончание. Использование этих нехитрых символов поможет не запутаться при чтении кода директивы.
  • Когда выборка строки выполняется исключительно по цифрам, то задавать данное условие следует максимально прямо. Точно так же следует явно указывать те цифры, которые являются постоянными.
  • Также не забывайте использовать точки для разделения расширений создаваемых ссылок.

Пример работы с внешним редиректом

На практике имеют место случаи, когда возникает бесконечный цикл перенаправлений. Это может произойти в результате неправильного выбора условий в выражениях. Данная ситуация возникает в случае, когда нужно сделать редирект с одной страницы на другую; при этом замена URI на желаемый и дальнейший редирект по каким-то причинном невозможны. Тогда программист использует выражение вида:

RewriteRule ^info.html information.html [R,L]

Это не приведет к должному результату, потому что возникнет обратное перенаправление на исходную страницу и так далее до бесконечности. Решение данной проблемы заключается в использовании дополнительной переменной окружения. Тогда полный пример будет выглядеть так:

RewriteCond %{ENV:REDIRECT_FINISH} !^$

RewriteRule ^ — [L]

RewriteRule ^info.html$ information.html [R,L]

RewriteRule ^information.html$ info.html [E=FINISH:1]

Также можно воспользоваться дополнительной проверкой запроса от посетителя сайта.

RewriteCond %{THE_REQUEST} «^(GET|POST|HEAD) /info.html HTTP/[0-9.]+$»

RewriteRule ^info.html$ information.html [R,L]

RewriteRule ^information.html$ info.html

Раскрытие ссылок

Часто возникают ситуации, когда происходит так называемое раскрытие ссылок. Это происходит автоматически, так как они закодированы специальным образом. Иногда это действие не требуется. В таком случае программисты прибегают к использованию переменной %{THE_REQUEST}:.

Полную информацию по редиректу можно найти в официальной документации на Apache. Более того, у каждого программиста она должна быть всегда под рукой, потому что существует много особенностей, которые запомнить просто невозможно.


Руководитель Rush Analytics Дмитрий Цытрош
Просмотров
13650
Рейтинг
5,0/5
Оценить
Комментариев
1
Комментировать
Оцените статью Оценка анонимная
Комментарии
  1. admin
    15 апреля 2022 18:29

    Спасибо, очень позновательно.

    2
    4
    Ответить
Добавить комментарий

Ваш адрес email не будет опубликован

Rush Analytics

Другие наши статьи

На страницу статей

Получите 7 дней бесплатного доступа

Здесь вы можете собрать поисковые подсказки из Яндекс, Google или YouTube

Зарегистрироваться