2.7.1.1.11. Регулярные выражения
Внимание!
На хостинге всегда используется актуальная версия Apache. В Apache 2.4.53 была исправлена давняя ошибка, из-за которой могли работать заведомо некорректные регулярные выражения. Это могло повлиять на работу сайтов, которые создавались под старые версии Apache и у которых в файле .htaccess присутствуют некорректные регулярные выражения. Решить проблему можно несколькими способами: самостоятельно найти и исправить проблемные регулярные выражения, обратиться за помощью к разработчику сайта, попробовать обновить CMS до актуальной версии, в которой проблема могла быть исправлена.В директивах .htaccess можно использовать perl-подобные регулярные выражения для гибкой настройки правил. Регулярные выражения, как правило, применяются в связке с переменными веб-сервера. Пример регулярного выражения:
RedirectMatch /([^/]*)/([^/]*)/script.php$ http://example.com/index.php?$1=$2
Синтаксис
.— заменяет один любой символ.?— указывает на необязательное использование предыдущего символа (к примеру, в конструкцииtes?tбудут подходить как словаtestтак иtet).*— означает, что предыдущий символ (группа символов) может повторяться (данный символ указывает необязательный повтор, то есть символ может встречаться как 0 раз, так и бесконечное множество).[abc]— указывает перечень символов, совпадающих с буквамиa,bилис.[^abc]— перечень символов, которые не используются. То есть подойдет любой символ, кромеa,bилис.[abc]*— перечень идущих подряд символов, которые будут найдены в строке.[^abc]*— перечень недопустимых подряд идущих символов в строке.
+— означает, что предыдущий символ (группа символов) должна повторяться (в отличии от*, данный символ указывает обязательный повтор, то есть символ может встречаться как минимум 1 раз).!— символ логического НЕ, используется для формирования правил исключений.|— символ логического ИЛИ, устанавливается в группах.()— группировка конструкций.{x}— повторение символа несколько раз, гдеX— количество повторений (несколько вариантов нужно задавать через запятую).\— экранирование служебных символов для использования их в шаблонах..*— указание любого количества символов в любом порядке./.*/— в таком случае будут подходить все подстроки между слешами.
^— начало строки, используется в начале выражения.$— конец строки, указывается в конце строки.
\w— указывает на букву, цифру или подчёркивание_.\W— любой символ, кроме букв, цифр и знака подчеркивания.\d— указывает на любую цифру.\D— указывает на любой символ, кроме цифр.\s— любой символ пробела (отступа).\S— любой не пробельный символ.
Выборка из таблицы ASCII:
[0-9]— диапазон цифр от 0 до 9.[a-z]— диапазон букв от a до z, латинский набор символов в нижнем регистре.[A-Z]— диапазон букв от A до Z в верхнем регистре.[a-zA-Z]или[a-Z]— диапазон букв от a до Z в любом регистре.
Условия
Лексическое сравнение — это сравнение символов в порядке их указания (в лексикографическом порядке), что значит, что 12 меньше, чем 2.
<— Лексически меньше.>— Лексически больше.<=— Лексически меньше или равно.>=— Лексически больше или равно.=— Лексически равно.!=— Лексически не равно.
Числовое сравнение:
-lt— Меньше.-gt— Больше.-le— Меньше или равно.-ge— Больше или равно.-eq— Равно.-ne— Не равно.
Информация о целевом пути:
-d— Является ли целевой путь каталогом.-f— Является ли целевой путь файлом.-s— Является ли целевой путь файлом с размером больше 0.-l— Является ли целевой путь символической ссылкой.-x— Есть ли у целевого пути права на исполнение.
Примеры использования
Для примера два URL:
http://example.com/someurl/44/test/regular/expression.phphttp://example.com/url/4/another/test/somefile.php
Для создания шаблона переадресации, в который будут входить все запросы, которые начинаются с someurl, нужно указать так:
RewriteCond %{REQUEST_URI} ^/someurl/
В таком случае оба адреса будут подпадать под правило:
RewriteCond %{REQUEST_URI} ^/.*url/
Используя значение ИЛИ можно добиться правил для нескольких вариантов:
RewriteCond %{REQUEST_URI} ^/(someurl|url)/
Используя диапазон и повторение можно добиться правил для перебора подходящих значений, пример выведет первый адрес:
RewriteCond %{REQUEST_URI} ^(/+)[0-9]{2}(/+)
А такой пример выведет второй адрес:
RewriteCond %{REQUEST_URI} ^(/+)[0-9](/+)
Чтобы исключить из запроса ссылку с использованием regular, следует воспользоваться таким правилом:
RewriteCond %{REQUEST_URI} !/regular/