2.7.1.1.11. Регулярні вирази

Увага!

На хостингу завжди використовується актуальна версія Apache. В Apache 2.4.53 була виправлена давня помилка, через яку могли працювати завідомо некоректні регулярні вирази. Це могло вплинути на роботу сайтів, які створювалися під старі версії Apache і в яких у файлі .htaccess присутні некоректні регулярні вирази. Вирішити проблему можна декількома способами: самостійно знайти і виправити проблемні регулярні вирази, звернутися за допомогою до розробника сайту, спробувати оновити CMS до актуальної версії, в якій проблема могла бути виправлена.
Виконувати тестування та налагодження регулярних виразів зручно за допомогою сервісів, таких як regex101.com або regexr.com.

У директивах .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:

  1. http://example.com/someurl/44/test/regular/expression.php
  2. http://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/ 
Зміст

    (1)