Модуль 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]
Этот пример показывает, как можно заблокировать диапазон 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 для переадресации посетителей к определенным файлам.
Автор: Denveroid
Источник: SiteMaker.Ru

Опубликовано в: Модули Apache Январь 9, 2007

91 Комментариев »

  1. Информативная статья, очень помогла. Спасибо!

    Комментарий от Александр — Январь 29, 2007 @ 11:09 pm

  2. угу. спасибо. очень помогло при настройке .htaccess для wordpress

    Комментарий от pacho — Август 3, 2007 @ 10:32 pm

  3. оч хорошая статья по такой муторной вещи.
    спасибо!
    тока не могу найти первую часть…

    Комментарий от роспись — Октябрь 19, 2007 @ 9:21 am

  4. скока пытаюсь въехать в эту тему, никак получается, глаза от этих заокрючек разбегаются

    Комментарий от Борис — Май 5, 2008 @ 6:59 pm

  5. Подскажите пжлст, как переписать URL с www.sitename.ru/forum/index.php на www.sitename.ru/smfforum/index.php. Форум крутится внутри ЦМС Друпал. Если ссылку из форума по правой кнопке открыть в новом окне, то ссылка преобразовывается в www.sitename.ru/forum/index.php и открывается просто форум, без оболочки сайта на друпале (если в url заменить forum на smfforum, то открывается эта же страница форума, но внутри друпала). Спасибо всем ответившим!

    Комментарий от Sebismil — Май 9, 2008 @ 11:12 pm

  6. спасибо за статью

    Комментарий от vikTOR — Июнь 5, 2008 @ 12:19 pm

  7. спасибо за пост

    Комментарий от vika — Июнь 6, 2008 @ 11:06 am

  8. спасибо большое

    Комментарий от ToyBoy — Июнь 7, 2008 @ 1:32 pm

  9. спасибо большое за статью

    Комментарий от GaMeR — Июнь 19, 2008 @ 2:57 pm

  10. спасибо за статью. очень помог с диапазноми ипов

    Комментарий от griff — Июль 6, 2008 @ 1:44 pm

  11. Спасибо, очень помогло!)

    Комментарий от Пенобетон — Июль 14, 2008 @ 11:57 pm

  12. СПАСИБО ТЕБЕ БОЛЬШОЕ

    Комментарий от rateman — Август 2, 2008 @ 7:38 pm

  13. ДА!! ОГРОМНОЕ СПАСИБО!!! НАШЕЛ ТО ЧТО ИСКАЛ!!!РЕСПЕКТ!
    ______________________
    /go.php?url=/go.php?url=http://pamyatniki-ceni.ru/

    Комментарий от андрюха — Август 30, 2008 @ 11:20 pm

  14. СУПЕР ИНФА! РЕСПЕКТ!!
    ________________________
    /go.php?url=/go.php?url=http://cheburashka.org/

    Комментарий от чувак — Сентябрь 10, 2008 @ 8:51 pm

  15. Да оч классная инфа! суперские статьи по этой теме ! респект!
    ____________________________________
    /go.php?url=http://www.getedes.com/

    Комментарий от magamozg — Сентябрь 20, 2008 @ 2:54 pm

  16. Автору респект! Легко читается, понятно даже чайнику. Возникло огромное желание почитать manual по Apache - никак не мог себя заставить.

    Комментарий от vsivsi — Сентябрь 30, 2008 @ 11:09 pm

  17. Теперь все более или мение понятно, конечно тут нужно ещё посидеть поразмышлять, за проделанный вами труд спасибо.

    Комментарий от Lokpos — Октябрь 12, 2008 @ 4:35 pm

  18. Ои зачитался. Но всетаки без чьеи-то помощи не обоитись

    Комментарий от Антон — Октябрь 16, 2008 @ 11:32 pm

  19. hell0 w0rld

    Комментарий от Захар — Октябрь 21, 2008 @ 8:25 pm

  20. ну превед

    Комментарий от Богдан — Октябрь 21, 2008 @ 8:25 pm

  21. РИАЛНЕ

    Комментарий от Богдан — Октябрь 21, 2008 @ 8:26 pm

  22. слишком сложно, есть более простой метод

    Комментарий от Фёдор — Октябрь 26, 2008 @ 7:25 pm

  23. спасибо за инфу, давно такую искал! решил свою проблему

    Комментарий от металлоконструкции — Октябрь 31, 2008 @ 2:23 pm

  24. оч хорошая статья по такой муторной вещи.

    Комментарий от Валерия — Ноябрь 8, 2008 @ 12:10 pm

  25. В свое время пришлось помучатся с этом модулем и его настроикой.

    Комментарий от Леонард — Ноябрь 19, 2008 @ 12:57 pm

  26. Всё равно пришлось заказывать за деньги. Зато, когда сделали всё стало понятно. Один неверный знак обошёлся мне в 15 баксов. И ещё может кому пригодиться нужно обязательно чтобы сайт лежал в папке www. А то я в этой папке создал подпапку и ничего у меня не получилось. Спасибо за статью.

    Комментарий от Игорь — Ноябрь 29, 2008 @ 12:46 pm

  27. Спасибо!
    Понятно даже такому нубу как я)))

    Комментарий от chaos794 — Декабрь 2, 2008 @ 7:56 pm

  28. Спасибо, статья носит рекомендательный характер, для тех кто не понял.

    Комментарий от роза — Декабрь 5, 2008 @ 3:53 pm

  29. согласен…

    Комментарий от Виктор — Декабрь 22, 2008 @ 11:03 pm

  30. А зачем эти почтовые сборщики вообще нужны? Чтоб спамить потом?

    Комментарий от Ипполит — Декабрь 23, 2008 @ 10:53 am

  31. Это точно, при попытке положить в какую либо папку кроме www или не работает или страшно глючит.

    Комментарий от hunter_89 — Декабрь 23, 2008 @ 6:24 pm

  32. Полностью согласен с предыдущим постом

    Комментарий от stas40 — Декабрь 23, 2008 @ 6:26 pm

  33. Конечно написано все вроде понятно, но вот как теперь одной привести все это в действие - пока проблема.

    Комментарий от маша — Декабрь 29, 2008 @ 10:54 am

  34. Подскажите пжлст, как переписать URL с www.sitename.ru/forum/index.php на www.sitename.ru/smfforum/index.php. Форум крутится внутри ЦМС Друпал. Если ссылку из форума по правой кнопке открыть в новом окне, то ссылка преобразовывается в www.sitename.ru/forum/index.php и открывается просто форум, без оболочки сайта на друпале (если в url заменить forum на smfforum, то открывается эта же страница форума, но внутри друпала). Спасибо всем ответившим!

    Комментарий от Милан — Февраль 5, 2009 @ 1:29 am

  35. Флажок NC позволяет игнорировать регистр букв в искомом образце. Например:
    RewriteCond %{HTTP_USER_AGENT} ^emailsiphon [NC]

    Комментарий от Аделина — Февраль 5, 2009 @ 10:02 pm

  36. Нужно освободить сайт от спама, введите жесткую модерацию!

    Комментарий от Кирилл — Февраль 10, 2009 @ 10:31 pm

  37. Отличные собраны материалы!

    Комментарий от Вероника — Февраль 10, 2009 @ 10:32 pm

  38. Думаю людям, не имеющим представления Apache читать эту статью и что-то понимать бессмысленно и нереально

    Комментарий от Марианна — Март 2, 2009 @ 4:45 pm

  39. Марианна, а вы хорошо в Апач разбираетесь?

    Комментарий от Валерий — Март 5, 2009 @ 11:36 am

  40. Напомню, что mod_rewrite является модулем, который предоставляет “основанный на правилах механизм динамического изменения запрашиваемых URL-ов”.

    Комментарий от Олег — Март 5, 2009 @ 8:52 pm

  41. большое спасибо!Взяла себе тоже-пригодится.

    Комментарий от webyswor — Март 6, 2009 @ 12:04 am

  42. Олег, спасибо з разъяснения касательно модуля

    Комментарий от Юлия — Март 10, 2009 @ 10:04 am

  43. Спасибо за статью.. Актуально мне сейчас.. Взяла себе еще перечитать.

    Комментарий от incolo — Март 16, 2009 @ 7:15 pm

  44. Статья действительно актуальная

    Комментарий от deniskaaaaa — Март 17, 2009 @ 12:38 am

  45. функция поиска в тексте данных, соответствующих шаблону (образцу), описанному в синтаксисе регулярных выражений.

    Комментарий от Зоя — Март 17, 2009 @ 10:21 am

  46. На Ваш блог знакомый в аську ссылку кинул. Оказалось ,что не зря Понравилось. Тепрь постоянно читать буду

    Комментарий от bralay — Март 18, 2009 @ 3:32 am

  47. Добавил в свои закладки. Теперь буду вас намного почаще читать!

    Комментарий от TotWoowl — Март 18, 2009 @ 10:19 am

  48. Огромное вам пасибо! а еще посты на эту тему будут в будущем? Очень жду!

    Комментарий от Axiopy — Март 19, 2009 @ 9:22 pm

  49. а вот вопросик можно? У вас время после поста указано. Это московское? Заранее спасибо!

    Комментарий от webyswor — Март 20, 2009 @ 5:31 am

  50. Классно всё: и картинка ,и информация

    Комментарий от QuobguemTego — Март 20, 2009 @ 12:27 pm

  51. какая радость!

    Комментарий от Наталья — Март 20, 2009 @ 5:28 pm

  52. Всех приглашаю на мой день рождения!

    Комментарий от Аркадий — Март 20, 2009 @ 5:29 pm

  53. Кули блогом не пишешь?

    Комментарий от Диана — Март 20, 2009 @ 5:30 pm

  54. BULLSHIT!

    Комментарий от Олег — Март 20, 2009 @ 5:30 pm

  55. Да, похоже что в действительности - так оно и есть. P.S. Сайт, кстати, у вас прикольно сверстан

    Комментарий от Graraererm — Март 20, 2009 @ 8:15 pm

  56. Благодарю!!!У Вас часто появляются очень интересные посты! Очень поднимаете мое настроение.

    Комментарий от chaife — Март 24, 2009 @ 12:38 am

  57. Отличный пост, прочитав несколько статей на эту тему понял, что всё таки не посмотрел с другой стороны, а пост как-то очень заинтересовал.

    Комментарий от rattLemn — Март 25, 2009 @ 12:20 am

  58. Спасибо за пост. А то пару дней мучался никак не мог разобраться что к чему.

    Комментарий от Аркадий — Март 25, 2009 @ 3:43 pm

  59. Очень интересно!!! Только не очень могу понять как часто обновляется ваш блог?

    Комментарий от unwimb — Март 26, 2009 @ 9:21 pm

  60. Сенкс за инфу, почитал с интересом
    Всё пройдёт - и надежды зерно не взойдёт.
    Всё что ты накопил - ни за грош пропадёт.
    Если ты не поделишься вовремя с другом -
    Всё твоё достоянье врагу отойдёт.

    Комментарий от BAST — Март 29, 2009 @ 1:16 am

  61. Очень интересно, но все в будущем хотелось бы еще побольше узнать об этом. Очень понравилась ваша статья!

    Комментарий от Greerinesmen — Апрель 1, 2009 @ 9:32 pm

  62. Классно всё: и картинка ,и информация

    Комментарий от Affors — Апрель 2, 2009 @ 2:37 pm

  63. как сказал один очень умный и известный человек ) …
    В сей мир едва ли снова попадём,
    Своих друзей вторично не найдём.
    Лови же миг! Ведь он не повторится,
    Как ты и сам не повторишься в нём

    Комментарий от plaype — Апрель 3, 2009 @ 2:21 am

  64. как сказал один очень умный человек которого мы все хорошо знаем )
    Благородство и подлость, отвага и страх –
    Все с рожденья заложено в наших телах.
    Мы до смерти не станем ни лучше, ни хуже –
    Мы такие, какими нас создал Аллах!

    Комментарий от enrory — Апрель 4, 2009 @ 6:24 pm

  65. Да уж. В этом блоге хоть комментаторы нормальные.. А то пишут обычно в комментарии ерунду всякую.

    Комментарий от naissemymn — Апрель 6, 2009 @ 1:30 am

  66. Вот решил вам немного помочь и послал этот пост в социальные закладки. Очень надеюсь ваш рейтинг возрастет.

    Комментарий от Teaxdive — Апрель 6, 2009 @ 2:12 pm

  67. Я бы сказала о монументальности, грандиозности некоторых сюжетов. А назвала бы - “нефильтрованный реал”. На мой взгляд, красота - это все-таки другое: лучшее, чистое, избранное, заставляющее трепетать и поражаться. Можно найти красоту во всем, но всё скопом - не есть красота. Имхо.

    Комментарий от BenfesAleple — Апрель 7, 2009 @ 2:36 am

  68. Огромное человеческое спасбо!

    Комментарий от addedold — Апрель 8, 2009 @ 12:07 am

  69. Можно и подискутировать по этому поводу …

    Комментарий от Dadbaccefe — Апрель 8, 2009 @ 2:48 am

  70. Добавил в свои закладки. Теперь буду вас намного почаще читать!

    Комментарий от Frurobam — Апрель 9, 2009 @ 2:57 am

  71. Спасибо

    Комментарий от Антон М. — Апрель 9, 2009 @ 11:32 am

  72. Ты как обычно радуешь нас своими лучшими фразами спасибо, беру!

    Комментарий от Axorgoheerse — Апрель 9, 2009 @ 1:28 pm

  73. Ваш сайт в опере не очень то корректо показывается, а так все отлично! спасибки вам за умные мысли!

    Комментарий от BenfesAleple — Апрель 10, 2009 @ 8:57 am

  74. Опутеть как интересно, во задвигаете. Класс!

    Комментарий от Whommarp — Апрель 10, 2009 @ 12:37 pm

  75. Опутеть как интересно, во задвигаете. Класс!

    Комментарий от Oxiste — Апрель 11, 2009 @ 2:37 pm

  76. Да интересно было узнать.Спасибо.

    Комментарий от Владик — Апрель 12, 2009 @ 10:33 am

  77. Ведь кто то это все придумывает

    Комментарий от Владик — Апрель 12, 2009 @ 11:43 am

  78. Спасибо огромное. Почитал и понравилось. Картинок бы ещё

    Комментарий от Enfofe — Апрель 12, 2009 @ 4:16 pm

  79. Очень интересно. Но чего-то не хватает. Может быть, стоит добавить каких-нибудь картинок или фото?

    Комментарий от ethenceevoft — Апрель 13, 2009 @ 3:11 am

  80. Опубликовал на своем блоге вашу статью, и напечатол там конечно-же обратную ссылку на вас. Но вот зашел посмотреть поевился ли трекбек, а его нет…

    Комментарий от glasushili — Апрель 13, 2009 @ 5:35 pm

  81. Ага, теперь понятно…А то я сразу не очень то и не понял где тут связь с самим заголовком…

    Комментарий от addedold — Апрель 15, 2009 @ 10:41 am

  82. А Вы не задумывались о том, чтобы параллельно завести еще один блог, на смежную тему? У Вас неплохо получается

    Комментарий от aliefeOriepe — Апрель 15, 2009 @ 1:46 pm

  83. большое спасибо!Взяла себе тоже-пригодится.

    Комментарий от snunkented — Апрель 15, 2009 @ 11:36 pm

  84. Ага, теперь понятно…А то я сразу не очень то и не понял где тут связь с самим заголовком…

    Комментарий от Axorgoheerse — Апрель 16, 2009 @ 11:42 pm

  85. вы шутите…21 век на дворе, неужели нет ничего достойного внимания, как энциклопедия.Милые мои, вот нет снега в
    гордах, это тоже тема и история, пересмотрите темы.Я почту просматриваю, мне шлют не пойми что, не знаю кто, столько мусора, может оно и нужно, но не в дневнике.Я так понимаю, дневник это часть твоей души.Нам дается право выбирать - пользуйтесь. А информация бесполезной не бывает

    Комментарий от astedudgitte — Апрель 17, 2009 @ 12:46 am

  86. а вот вопросик можно? У вас время после поста указано. Это московское? Заранее спасибо!

    Комментарий от wousty — Апрель 17, 2009 @ 12:48 am

  87. Очень понравилось, даже не ожидала.

    Комментарий от astencecet — Апрель 18, 2009 @ 10:01 am

  88. Спасибки админам, я уже обыскался, а у вас нашёл основы модуля mod_rewrite
    классно у вас выходит заинтересовывать читателей

    Комментарий от Гость — Апрель 18, 2009 @ 7:08 pm

  89. У вас RSS в кривой кодировке!

    Комментарий от Diemyheile — Апрель 19, 2009 @ 3:41 am

  90. а вот вопросик можно? У вас время после поста указано. Это московское? Заранее спасибо!

    Комментарий от inpura — Апрель 20, 2009 @ 1:25 am

  91. Спасибо за статью. Восхищена как всегда

    Комментарий от Fersodebed — Апрель 20, 2009 @ 1:25 am

Оставить комментарий

You must be logged in to post a comment.

© apachedev.ru, 2005-2011