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/