У минулому розділі ми познайомилися з основами модуля mod_rewrite. У прикладі, який був розглянутий, ми використовували конструкцію, яка в буквальному сенсі означає наступне: «Якщо хтось намагається отримати доступ до файлу .htaccess, видається помилка, яка повідомляє, що доступ до файлу заборонений».

Це «правило» глобально, тобто кожен отримає таке повідомлення про помилку. Нагадаю, що mod_rewrite є модулем, який надає «заснований на правилах механізм динамічного зміни запитуваних URL-ів».

Ми можемо обмежувати «правило» за допомогою різних умов правила». «Правило» буде виконано тільки в тому випадку, якщо перед ним буде зустрінутий ряд умов.

Синтаксис: умова має передувати правилом!

Візьмемо ще один приклад (запис у файлі .htaccess):

RewriteEngine on
Options +FollowSymlinks
RewriteBase /
RewriteCond %{HTTP_USER_AGENT} ^EmailSiphon
RewriteRule ^.*$ — [F]

Призначення перших трьох записів було детально розібрано у першій частині публікації. Їх функція — включення «движка перезапису», тобто самого модуля.

Останні два рядки забороняють доступ пошуковому роботу під кодовою назвою «EmailSiphon» (мається на увазі ім’я юзер-агента). Цей робот є збирачем поштових адрес з різних веб-сторінок.

Рядок:

RewriteCond %{HTTP_USER_AGENT} ^EmailSiphon

складається з трьох частин:

Директива (вказівка): RewriteCond
Перевірочна рядок: %{HTTP_USER_AGENT}
Зразок умови: ^EmailSiphon

Перевірочна рядок – мінлива сервера, що може бути записана в загальній формі: «% {ІМ’Я_ЗМІННОЇ}».

Зразок умови – регулярний вираз. Для більш повного розуміння теми варто розглянути регулярні вирази як клас.

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

Регулярні вирази – це механізм, що дозволяє задати шаблон для рядка і здійснити пошук даних, що відповідають цим шаблоном у заданому тексті. Крім того, додаткові функції по роботі з такими виразами дозволяють отримати знайдені дані у вигляді масиву рядків, провести заміну в тексті за шаблоном, розбиття рядка з шаблоном і т. п. Однак головною їх функцією, на якій засновані всі інші, є саме функція пошуку в тексті даних, відповідних шаблоном (зразком), описаного в синтаксис регулярних виразів.

Регулярні вирази подібні маленькому компактному мові програмування зі своїми правилами.

Наприклад, регулярний вираз:

s/abc/xyz/g

замінить рядок «abc», на рядок «xyz» у всьому тексті.

Ось короткий огляд найбільш важливих елементів з деякими прикладами:

. (точка) — текст (будь-який символ)
| — чергування (тобто/abc|def/)
* — квантіфікатор (дозволено будь-яке число)
^ $ — якоря рядка
s — оператор (string1 замінити на string2)
g — модифікатор (шукати по всьому тексту)

Регулярні вирази конструюються за допомогою цих елементів і інших «звичайних» символів. Вони не є окремою мовою, а використовуються іншими засобами, наприклад мовами програмування типу Perl або PHP, а також текстовими редакторами (Emacs).

Якщо говорити про зв’язки регулярних виразів і модуля mod_rewrite, то вони використовуються у директивах RewriteRule і RewriteCond.

«^» позначає початок рядка. З цього випливає, що UserAgent повинен починатися з рядка «EmailSiphon» і ні з чого іншого («NewEmailSiphon», наприклад, не працював).

Але, оскільки даний регулярний вираз не містить символ «$» (якір кінця рядка), UserAgent міг би бути, наприклад, «EmailSiphon2».

Останній рядок нашого прикладу:

RewriteRule ^.*$ — [F]

визначає, що саме потрібно робити, коли робот запросить доступ.

Регулярний вираз «^.*$» означає: «Доступ до всіх файлів заборонений».

Крапка «.» у регулярному виразі – мета символ (знак підстановки), що означає будь-який випадковий символ.

«*» означає, що рядок може зустрічатися необмежену кількість разів. У цьому випадку, незалежно від імені запитаного файла, буде видана помилка.

«EmailSiphon», звичайно, не єдиний поштовий складальник. Інший відомий член цього сімейства — «ExtractorPro». Припустимо ми хочемо заборонити доступ і цьому роботові. В такому випадку нам необхідно ще одна умова.

Тепер файл .htaccess буде виглядати так:

RewriteEngine on
Options +FollowSymlinks
RewriteBase /
RewriteCond %{HTTP_USER_AGENT} ^EmailSiphon [OR]
RewriteCond %{HTTP_USER_AGENT} ^ExtractorPro
RewriteRule ^.*$ — [F]

Третій аргумент [OR] (у першому рядку RewriteCond) називається «прапором». Існують два можливих прапора:

NC – не враховувати регістр букв.
OR – означає «чи наступне умова».

Прапорець NC дозволяє ігнорувати регістр букв у вихідному зразку. Наприклад:

RewriteCond %{HTTP_USER_AGENT} ^emailsiphon [NC]

Ця рядок визначає, що і «emailsiphon» і «EmailSiphon» будуть визнані як ідентичні вирази.

Ви можете використовувати відразу декілька прапорців, розділяючи їх комами.

RewriteCond % {HTTP_USER_AGENT} ^EmailSiphon [NC, OR]
RewriteCond % {HTTP_USER_AGENT} ^ExtractorPro

Немає ніяких обмежень по числу умов. Таким чином, Ви можете блокувати 10, 100, 1000 або більше відомих збирачів поштових. Визначення цих 1000 умов – просто питання завантаження сервера і прозорості файлу «.htaccess».

У вищезгаданому прикладі використовується глобальна змінна «HTTP_USER_AGENT». Існують також інші змінні:

REMOTE_HOST
REMOTE_ADDR

Наприклад, якщо Ви хочете заблокувати павука прийшов з www.site.ru Ви можете
використовувати глобальну змінну «REMOTE_HOST» таким чином:

RewriteCond % {REMOTE_HOST} ^www.site.ru$
RewriteRule ^.*$ — [F]

Якщо Ви хочете заблокувати певний IP адреса, умова буде виглядати так:

RewriteCond % {REMOTE_ADDR} ^212.37.64.10$
RewriteRule ^.*$ — [F]

У регулярному виразі по перевірці точного і повного IP адреси потрібно використовувати початкові і кінцеві якоря.

Також можна виключити цілий діапазон:

RewriteCond %{REMOTE_ADDR} ^212.37.64.
RewriteRule ^.*$ — [F]

Цей приклад показує, як можна заблокувати діапазон IP адрес з 212.37.64.0 по 212.37.64.255.

А ось маленька задачка для перевірки набутих знань (рішення буде дано в наступній частині):

RewriteCond %{REMOTE_ADDR} ^212.37.64
RewriteRule ^.*$ — [F]

Увага, питання!

Якщо ми пишемо в регулярному виразі «^212.37.64» замість «^212.37.64.» (з крапкою в кінці), то чи дасть це той самий ефект, і будуть виключені ті ж самі IP адреси?

Досі ми використовували простий RewriteRule, який генерує повідомлення про помилки. У третій частині публікації проаналізуємо, як можна використовувати RewriteRule для перенаправлення відвідувачів до певних файлів.