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