Регулярные выражения в файле .htaccess

19.04.16 21:25:29 19.04.16 21:39:53 504

Регулярные выражения в файле .htaccess используются в RewriteCond и RewriteRule, то есть для описания условий срабатывания правил и для описания самих правил. С помощью регулярных выражений задаются шаблоны строк. Синтаксис - такой же как в языке Perl.

Элементы
Метасимволы

Используются для задания групп символов или «меток» в шаблоне. Например, метки начала или конца строки. \ Экранирование. Считать следующий метасимвол обычным символом. ^ Метка начала строки. $ Метка конца строки. .(точка) Заменяет собой любой произвольный символ, но только один. Кроме символа конца строки. | Логическое ИЛИ, варианты выборки. () Группировка. [] Класс символов. Например, [abc]. [^...] Инвертированный класс символов. Например, [^abc]. Группировка () также используется для обратной связи с шаблоном, вернее для части строки, которая попадёт под группировку. Модификаторы Ставятся после обычных символов, метасимволов или их групп. Расширяют возможности использования шаблонов. ? Символ повторяется 0 или 1 раз. * Повторяется от 0 до 65536 раз. + Повторяется от 1 до 65536 раз. {n} Точно n раз. {n,} От n до 65536 раз включительно. {n,m} От n до m раз включительно.

Примеры шаблонов

^linux
Любые строки, начинающиеся со слова linux. Строка, начинающаяся со слова altlinux не удовлетворит критерию.

windows$
Любые строки, заканчивающиеся набором символов windows. Строка, заканчивающаяся на windows-suck под выбор не попадёт.

.*
Любой символ повторяется любое количество раз. Под критерий попадут все строки.

^(.*)$
Выбрать любую строку и сохранить её как переменную $1 для дальнейшего использования.

^(.+)/(.+)$
Разбить строку на две части: до слэша и после, части строки будут доступны по переменным $1 и $2.

Важно: так как модификатор жадный, то в первую группу попадёт максимальное количество символов, удовлетворяющих шаблону.
Слеш является таким же символом, как и все остальные.

Пример для ясности:

RewriteRule ^(.+)/(.+)$ /?a=$1&b=$2 [R=301,L] http://www.it-simple.ru/1/2/3/4/5 → http://www.it-simple.ru/?a=1/2/3/4&b=5

[0-9]{1,6}$
Выбрать все строки, оканчивающиеся от 1 до 6 цифами из диапазона от 0 до 9.
Примеры правил

В начало .htaccess обычно ставят:

RewriteEngine On RewriteBase /

Первая строка включает обработку правил, вторая — обрезает полный путь (от корня сервера) до корня сайта.
/home/papka-s-saitom/public_html/razdel/podrazdel/ — таким был путь до RewriteBase /
/razdel/podrazdel/ — таким станет после

Благодаря «RewriteBase /» удобнее делать преобразования URI (убирается привязка к физическому расположению файлов сайта на сервере).

Ставим 301 редирект с www.имя.сайта на имя.сайта
(убираем "www").

RewriteCond %{HTTP_HOST} ^www.имя.сайта$ RewriteRule (.*) http://имя.сайта/$1 [R=301,L]

Делается для поисковых машин, чтобы не бить статистику.

При запросе файла .htaccess говорим, что он не существует (410, GONE).

RewriteRule ^/.htaccess$ - [G]

Запрещаем вход на сайт Интернет Експлореру (вернее, кто себя так определяет) и пользователям с определённого IP-адреса (xxx.xxx.xxx.xxx).

RewriteCond %{HTTP_USER_AGENT} MSIE RewriteCond %{REMOTE_ADDR} ^xxx\.xxx\.xxx\.xxx$ RewriteRule ^.*$ - [F]

Изменяем переменные php и передаём обработку другому скрипту.

RewriteCond %{QUERY_STRING} ^parameter=(.+)$ RewriteRule (.*) parameter.php\?%1 [L]

В этом примере запрос вида
index.php?parameter=some
преобразуется в
parameter.php?some

Убираем переменные php из запроса
(вырезаем из URI всё, что находится после знака вопроса)

RewriteRule (.*) $1? [R=301,L]