У минулому розділі ми познайомилися з основами модуля 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 для перенаправлення відвідувачів до певних файлів.