Модуль 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 для переадресації відвідувачів до певних файлів.
Коментарі
Коментуючи, пам'ятайте про те, що зміст і тон Вашого повідомлення можуть зачіпати почуття реальних людей, проявляйте повагу та толерантність до своїх співрозмовників навіть у тому випадку, якщо Ви не поділяєте їхню думку, Ваша поведінка за умов свободи висловлювань та анонімності, наданих інтернетом, змінює не тільки віртуальний, але й реальний світ. Всі коменти приховані з індексу, спам контролюється.