Серверная (www.it-simple.ru)

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


Регулярные выражения в файле .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]