This page has been robot translated, sorry for typos if any. Original content here.

Модуль mod_rewrite ч.2

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