Модуль mod_rewrite. Часть 2
В прошлой главе мы познакомились с основами модуля mod_rewrite. В примере, который был рассмотрен, мы использовали конструкцию, которая в буквальном смысле означает следующее: "Если кто-то пытается получить доступ к файлу .htaccess, выдается ошибка, сообщающая, что доступ к файлу запрещен".
Это "правило" глобально, то есть каждый получит указанное сообщение об ошибке. Напомню, что mod_rewrite является модулем, который предоставляет "основанный на правилах механизм динамического изменения запрашиваемых URL-ов".
Мы можем ограничивать "правило" при помощи различных "условий правила". "Правило" будет выполнено только в том случае, если перед ним будет встречен ряд условий.
Синтаксис: условие должно предшествовать правилу!
Возьмем еще один пример (запись в файле .htaccess):
RewriteEngine on
Options +FollowSymlinks
RewriteBase /
RewriteCond %{HTTP_USER_AGENT} ^EmailSiphon
RewriteRule ^.*$ - [F]
Options +FollowSymlinks
RewriteBase /
RewriteCond %{HTTP_USER_AGENT} ^EmailSiphon
RewriteRule ^.*$ - [F]
Назначение первых трех записей было подробно разобрано в первой части публикации. Их функция - включение "движка перезаписи", то есть самого модуля.
Последние две строки запрещают доступ поисковому роботу под кодовым названием "EmailSiphon" (имеется ввиду имя юзер-агента). Данный робот является сборщиком почтовых адресов с различных веб страниц.
Строка:
RewriteCond %{HTTP_USER_AGENT} ^EmailSiphon
состоит из трех частей:
Директива (указание): RewriteCond
Проверочная строка: %{HTTP_USER_AGENT}
Образец условия: ^EmailSiphon
Проверочная строка: %{HTTP_USER_AGENT}
Образец условия: ^EmailSiphon
Проверочная строка – переменная сервера, которая может быть записана в общей форме: "% {ИМЯ_ПЕРЕМЕННОЙ}".
Образец условия – регулярное выражение. Для более полного понимания темы стоит рассмотреть регулярные выражения как класс.
Регулярные выражения
Регулярные выражения – это механизм, позволяющий задать шаблон для строки и осуществить поиск данных, соответствующих этому шаблону в заданном тексте. Кроме того, дополнительные функции по работе с такими выражениями позволяют получить найденные данные в виде массива строк, произвести замену в тексте по шаблону, разбиение строки по шаблону и т.п. Однако главной их функцией, на которой основаны все остальные, является именно функция поиска в тексте данных, соответствующих шаблону (образцу), описанному в синтаксисе регулярных выражений.
Регулярные выражения подобны маленькому, компактному языку программирования со своими правилами.
Например, регулярное выражение:
s/abc/xyz/g
заменит строку "abc", на строку "xyz" во всем тексте.
Вот краткий обзор наиболее важных элементов с некоторыми примерами:
. (точка) - текст (любой символ)
| - чередование (то есть /abc|def/)
* - квантификатор (разрешено любое число)
^ $ - якоря строки
s - оператор (string1 заменить на string2)
g - модификатор (искать по всему тексту)
| - чередование (то есть /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]
Options +FollowSymlinks
RewriteBase /
RewriteCond %{HTTP_USER_AGENT} ^EmailSiphon [OR]
RewriteCond %{HTTP_USER_AGENT} ^ExtractorPro
RewriteRule ^.*$ - [F]
Третий аргумент [OR] (в первой строке RewriteCond) называется "флагом". Существуют два возможных флага:
NC – не учитывать регистр букв.
OR – означает "или следующее условие".
OR – означает "или следующее условие".
Флажок NC позволяет игнорировать регистр букв в искомом образце. Например:
RewriteCond %{HTTP_USER_AGENT} ^emailsiphon [NC]
Эта строка определяет, что и "emailsiphon" и "EmailSiphon" будут признаны как идентичные выражения.
Вы можете использовать сразу несколько флажков, разделяя их запятыми.
RewriteCond % {HTTP_USER_AGENT} ^EmailSiphon [NC, OR]
RewriteCond % {HTTP_USER_AGENT} ^ExtractorPro
RewriteCond % {HTTP_USER_AGENT} ^ExtractorPro
Нет никаких ограничений по числу условий. Таким образом, Вы можете блокировать 10, 100, 1000 или более известных почтовых сборщиков. Определение этих 1000 условий – просто вопрос загрузки сервера и прозрачности файла .htaccess.
В вышеупомянутом примере используется глобальная переменная HTTP_USER_AGENT. Существуют также другие переменные:
REMOTE_HOST
REMOTE_ADDR
REMOTE_ADDR
Например, если Вы хотите заблокировать паука пришедшего с www.site.ru, Вы можете использовать глобальную переменную REMOTE_HOST таким образом:
RewriteCond % {REMOTE_HOST} ^www.site.ru$
RewriteRule ^.*$ - [F]
RewriteRule ^.*$ - [F]
Если Вы хотите заблокировать определенный IP адрес, условие будет выглядеть так:
RewriteCond % {REMOTE_ADDR} ^212.37.64.10$
RewriteRule ^.*$ - [F]
RewriteRule ^.*$ - [F]
В регулярном выражении по проверке точного и полного IP адреса нужно использовать начальные и конечные якоря.
Также можно исключить целый диапазон:
RewriteCond %{REMOTE_ADDR} ^212.37.64.
RewriteRule ^.*$ - [F]
RewriteRule ^.*$ - [F]
Этот пример показывает, как можно заблокировать диапазон IP адресов с 212.37.64.0 по 212.37.64.255.
А вот маленькая задачка для проверки приобретенных знаний (решение будет дано в следующей части):
RewriteCond %{REMOTE_ADDR} ^212.37.64
RewriteRule ^.*$ - [F]
RewriteRule ^.*$ - [F]
Внимание, вопрос!
Если мы пишем в регулярном выражении "^212.37.64" вместо "^212.37.64." (с точкой в конце), то даст ли это тот же самый эффект, и будут ли исключены те же самые IP адреса?
До сих пор мы использовали простой RewriteRule, который генерирует сообщение об ошибках. В третьей части публикации мы проанализируем, как можно использовать RewriteRule для переадресации посетителей к определенным файлам.
Автор: Denveroid
Источник: SiteMaker.Ru
Источник: SiteMaker.Ru
Комментарий от Александр — Январь 29, 2007 @ 11:09 pm
Комментарий от pacho — Август 3, 2007 @ 10:32 pm
спасибо!
тока не могу найти первую часть…
Комментарий от роспись — Октябрь 19, 2007 @ 9:21 am
Комментарий от Борис — Май 5, 2008 @ 6:59 pm
Комментарий от Sebismil — Май 9, 2008 @ 11:12 pm
Комментарий от vikTOR — Июнь 5, 2008 @ 12:19 pm
Комментарий от vika — Июнь 6, 2008 @ 11:06 am
Комментарий от ToyBoy — Июнь 7, 2008 @ 1:32 pm
Комментарий от GaMeR — Июнь 19, 2008 @ 2:57 pm
Комментарий от griff — Июль 6, 2008 @ 1:44 pm
Комментарий от Пенобетон — Июль 14, 2008 @ 11:57 pm
Комментарий от rateman — Август 2, 2008 @ 7:38 pm
______________________
/go.php?url=/go.php?url=http://pamyatniki-ceni.ru/
Комментарий от андрюха — Август 30, 2008 @ 11:20 pm
________________________
/go.php?url=/go.php?url=http://cheburashka.org/
Комментарий от чувак — Сентябрь 10, 2008 @ 8:51 pm
____________________________________
/go.php?url=http://www.getedes.com/
Комментарий от magamozg — Сентябрь 20, 2008 @ 2:54 pm
Комментарий от vsivsi — Сентябрь 30, 2008 @ 11:09 pm
Комментарий от Lokpos — Октябрь 12, 2008 @ 4:35 pm
Комментарий от Антон — Октябрь 16, 2008 @ 11:32 pm
Комментарий от Захар — Октябрь 21, 2008 @ 8:25 pm
Комментарий от Богдан — Октябрь 21, 2008 @ 8:25 pm
Комментарий от Богдан — Октябрь 21, 2008 @ 8:26 pm
Комментарий от Фёдор — Октябрь 26, 2008 @ 7:25 pm
Комментарий от металлоконструкции — Октябрь 31, 2008 @ 2:23 pm
Комментарий от Валерия — Ноябрь 8, 2008 @ 12:10 pm
Комментарий от Леонард — Ноябрь 19, 2008 @ 12:57 pm
Комментарий от Игорь — Ноябрь 29, 2008 @ 12:46 pm
Понятно даже такому нубу как я)))
Комментарий от chaos794 — Декабрь 2, 2008 @ 7:56 pm
Комментарий от роза — Декабрь 5, 2008 @ 3:53 pm
Комментарий от Виктор — Декабрь 22, 2008 @ 11:03 pm
Комментарий от Ипполит — Декабрь 23, 2008 @ 10:53 am
Комментарий от hunter_89 — Декабрь 23, 2008 @ 6:24 pm
Комментарий от stas40 — Декабрь 23, 2008 @ 6:26 pm
Комментарий от маша — Декабрь 29, 2008 @ 10:54 am
Комментарий от Милан — Февраль 5, 2009 @ 1:29 am
RewriteCond %{HTTP_USER_AGENT} ^emailsiphon [NC]
Комментарий от Аделина — Февраль 5, 2009 @ 10:02 pm
Комментарий от Кирилл — Февраль 10, 2009 @ 10:31 pm
Комментарий от Вероника — Февраль 10, 2009 @ 10:32 pm
Комментарий от Марианна — Март 2, 2009 @ 4:45 pm
Комментарий от Валерий — Март 5, 2009 @ 11:36 am
Комментарий от Олег — Март 5, 2009 @ 8:52 pm
Комментарий от webyswor — Март 6, 2009 @ 12:04 am
Комментарий от Юлия — Март 10, 2009 @ 10:04 am
Комментарий от incolo — Март 16, 2009 @ 7:15 pm
Комментарий от deniskaaaaa — Март 17, 2009 @ 12:38 am
Комментарий от Зоя — Март 17, 2009 @ 10:21 am
Комментарий от bralay — Март 18, 2009 @ 3:32 am
Комментарий от TotWoowl — Март 18, 2009 @ 10:19 am
Комментарий от Axiopy — Март 19, 2009 @ 9:22 pm
Комментарий от webyswor — Март 20, 2009 @ 5:31 am
Комментарий от QuobguemTego — Март 20, 2009 @ 12:27 pm
Комментарий от Наталья — Март 20, 2009 @ 5:28 pm
Комментарий от Аркадий — Март 20, 2009 @ 5:29 pm
Комментарий от Диана — Март 20, 2009 @ 5:30 pm
Комментарий от Олег — Март 20, 2009 @ 5:30 pm
Комментарий от Graraererm — Март 20, 2009 @ 8:15 pm
Комментарий от chaife — Март 24, 2009 @ 12:38 am
Комментарий от rattLemn — Март 25, 2009 @ 12:20 am
Комментарий от Аркадий — Март 25, 2009 @ 3:43 pm
Комментарий от unwimb — Март 26, 2009 @ 9:21 pm
Всё пройдёт - и надежды зерно не взойдёт.
Всё что ты накопил - ни за грош пропадёт.
Если ты не поделишься вовремя с другом -
Всё твоё достоянье врагу отойдёт.
Комментарий от BAST — Март 29, 2009 @ 1:16 am
Комментарий от Greerinesmen — Апрель 1, 2009 @ 9:32 pm
Комментарий от Affors — Апрель 2, 2009 @ 2:37 pm
В сей мир едва ли снова попадём,
Своих друзей вторично не найдём.
Лови же миг! Ведь он не повторится,
Как ты и сам не повторишься в нём
Комментарий от plaype — Апрель 3, 2009 @ 2:21 am
Благородство и подлость, отвага и страх –
Все с рожденья заложено в наших телах.
Мы до смерти не станем ни лучше, ни хуже –
Мы такие, какими нас создал Аллах!
Комментарий от enrory — Апрель 4, 2009 @ 6:24 pm
Комментарий от naissemymn — Апрель 6, 2009 @ 1:30 am
Комментарий от Teaxdive — Апрель 6, 2009 @ 2:12 pm
Комментарий от BenfesAleple — Апрель 7, 2009 @ 2:36 am
Комментарий от addedold — Апрель 8, 2009 @ 12:07 am
Комментарий от Dadbaccefe — Апрель 8, 2009 @ 2:48 am
Комментарий от Frurobam — Апрель 9, 2009 @ 2:57 am
Комментарий от Антон М. — Апрель 9, 2009 @ 11:32 am
Комментарий от Axorgoheerse — Апрель 9, 2009 @ 1:28 pm
Комментарий от BenfesAleple — Апрель 10, 2009 @ 8:57 am
Комментарий от Whommarp — Апрель 10, 2009 @ 12:37 pm
Комментарий от Oxiste — Апрель 11, 2009 @ 2:37 pm
Комментарий от Владик — Апрель 12, 2009 @ 10:33 am
Комментарий от Владик — Апрель 12, 2009 @ 11:43 am
Комментарий от Enfofe — Апрель 12, 2009 @ 4:16 pm
Комментарий от ethenceevoft — Апрель 13, 2009 @ 3:11 am
Комментарий от glasushili — Апрель 13, 2009 @ 5:35 pm
Комментарий от addedold — Апрель 15, 2009 @ 10:41 am
Комментарий от aliefeOriepe — Апрель 15, 2009 @ 1:46 pm
Комментарий от snunkented — Апрель 15, 2009 @ 11:36 pm
Комментарий от Axorgoheerse — Апрель 16, 2009 @ 11:42 pm
гордах, это тоже тема и история, пересмотрите темы.Я почту просматриваю, мне шлют не пойми что, не знаю кто, столько мусора, может оно и нужно, но не в дневнике.Я так понимаю, дневник это часть твоей души.Нам дается право выбирать - пользуйтесь. А информация бесполезной не бывает
Комментарий от astedudgitte — Апрель 17, 2009 @ 12:46 am
Комментарий от wousty — Апрель 17, 2009 @ 12:48 am
Комментарий от astencecet — Апрель 18, 2009 @ 10:01 am
классно у вас выходит заинтересовывать читателей
Комментарий от Гость — Апрель 18, 2009 @ 7:08 pm
Комментарий от Diemyheile — Апрель 19, 2009 @ 3:41 am
Комментарий от inpura — Апрель 20, 2009 @ 1:25 am
Комментарий от Fersodebed — Апрель 20, 2009 @ 1:25 am