Модуль mod_rewrite. Часть 3


В двух предыдущих частях мы познакомились с основами "правил перезаписи" URL и "условиями правил". Позвольте предложить к рассмотрению два примера, иллюстрирующих более сложные приложения.
Первый пример имеет дело с динамическими страницами, а второй показывает возможности вызова ".txt" файлов и произведение различных действий над ними.

Предположим, что у нас есть виртуальный магазин по продаже каких-то товаров. Клиенты обращаются к описаниям товаров через скрипт:

http://www.yoursite.com/cgi-bin/shop.cgi?product1
http://www.yoursite.com/cgi-bin/shop.cgi?product2
http://www.yoursite.com/cgi-bin/shop.cgi?product3
Эти адреса представлены как ссылки на большинстве страниц сайта.
А теперь допустим, что вы решили добавить сайт для индексации в поисковые системы. Тут вас поджидает небольшая неприятность – не все поисковики принимают, понимают и индексируют URL, в которых содержится символ "?".
Более естественным и приемлемым для поисковика является URL вида:
http://www.yoursite.com/cgi-bin/shop.cgi/product1
В данном случае символ "?" заменяется на "/".
Еще более комфортабельный URL с точки зрения поисковика будет иметь вид:
http://www.yoursite.com/shop/product1
Для поисковика, shop теперь как-бы является директорией, содержащей товары product1, product2 и т.д.
Если пользователь, со страницы результатов запроса в поисковике проследует по такой ссылке, то эта ссылка должна будет трансформироваться в ссылку: shop.cgi?product1.
Чтобы добиться такого эффекта можно использовать mod_rewrite, используя следующую конструкцию в файле .htaccess:
RewriteEngine on
Options +FollowSymlinks
RewriteBase /
RewriteRule ^(.*)shop/(.*)$ $1cgi-bin/shop.cgi?$2
Переменные $1 и $2 составляют так называемые "backreferences". Они связаны с текстовыми группами. Вызываемый URL разбивается на части. Все, что находится перед shop, плюс все что находится после shop/ определяется и хранится в этих двух переменных: $1 и $2.
До этого момента, наши примеры использовали "правила" типа:
RewriteRule ^.htaccess*$ - [F]
Однако мы еще не достигли истинной перезаписи URL адресов, в смысле того, что один URL должен перенаправлять посетителя на другой.
Для нашей записи вида:
RewriteRule ^(.*)shop/(.*)$ $1cgi-bin/shop.cgi?$2
применяется общий синтаксис:
RewriteRule текущийURL перезаписываемыйURL
Как видите, эта директива выполняет действительную "перезапись" URL адреса.
В дополнение к записям в файл .htaccess, нужно еще заменить все ссылки на сайте, которые имеют формат cgi-bin/shop.cgi?product, на ссылки вида: shop/product
Теперь, когда поисковик найдет страницу с подобными ссылками, он проиндексирует сайт без всяких видимых проблем.
Таким образом вы можете превратить чисто динамический сайт в сайт, имеющий статическую структуру, что явно принесет пользу в вопросе индексирования различными посковыми машинами. Обратите внимание на вид URL адресов на данном сайте. Вдобавок ко всему, они имеют еще и легкочитамую для человека структуру - ЧПУ (человекопонятный УРЛ). Но об этом мы поговорим в другой статье.
В нашем втором примере мы обсудим, как переадресовать запросы .txt файлов к сценарию программы.
Многие хостинг провайдеры, работающие с Apache предоставляют лог-файлы в общем формате. Это означает то, что они не будут соджержать поля с ссылающимися страницами и юзер-агентами.
Однако, относительно запросов к файлу robots.txt, предпочтительно иметь доступ ко всем этим данным, чтобы иметь больше информации о посещении поисковиков, чем просто знать их IP адреса. Для того, чтобы оганизовать это, в .htaccess должны быть следующие записи:
RewriteEngine on
Options +FollowSymlinks
RewriteBase /
RewriteRule ^robots.txt$ /text.cgi?%{REQUEST_URI}
Теперь при запросе файла robots.txt наш RewriteRule переадресует посетителя (робота) к обрабатывающему запросы скрипту text.cgi. Кроме того, переменная передается скрипту, которая будет обработана в соответствии с вашими нуждами. REQUEST_URI определяет имя запрашиваемого файла. В данном примере это – robots.txt. Скрипт прочтет содержание robots.txt и отправит его web-браузеру или роботу поискового сервера. Таким образом, мы можем считать хиты посетителей и вести свои лог-файлы.
С этой целью, скрипт будет использовать переменные окружения $ENV {’HTTP_USER_AGENT‘} и т.д. Это обеспечит получение всей требуемой информации. Вот исходный текст для сценария cgi, упомянутого выше (пример взят с сайта http://fantomaster.com):
#!/usr/bin/perl
# If required, adjust line above to point to Perl 5.
#################################
# (c) Copyright 2000 by fantomaster.com #
# All rights reserved. #
#################################

$stats_dir = "stats";
$log_file = "stats.log";
$remote_host = "$ENV{’REMOTE_HOST’}";
$remote_addr = "$ENV{’REMOTE_ADDR’}";
$user_agent = "$ENV{’HTTP_USER_AGENT’}";
$referer = "$ENV{’HTTP_REFERER’}";
$document_name = "$ENV{’QUERY_STRING’}";
open (FILE, "robots.txt");
@TEXT = ;
close (FILE);
&get_date;
&log_hits
("$date $remote_host $remote_addr $user_agent $referer $document_name");
print "Content-type: text/plain
"
;
print @TEXT;
exit;
sub get_date {
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime();
$mon++;
$sec = sprintf ("%02d", $sec);
$min = sprintf ("%02d", $min);
$hour = sprintf ("%02d", $hour);
$mday = sprintf ("%02d", $mday);
$mon = sprintf ("%02d", $mon);
$year = scalar localtime;
$year =~ s/.*?(d{4})/$1/;
$date="$year-$mon-$mday, $hour:$min:$sec";
}
sub log_hits {
open (HITS, ">>$stats_dir/$log_file");
print HITS @_;
close (HITS);
}
Загрузите файл с данным содержимым в корневую или в DocumentRoot директорию сервера и установите права доступа у файлу (chmod) 755. Затем, создайте каталог stats. Более детальное описание о том, как установить скрипт вы можете получить на сайте разработчика.
Если настройки вашего сервера не позволяют исполнять cgi-сценарии в главной директории (DocumentRoot), то попробуйте следующий вариант:
RewriteRule ^robots.txt$ /cgi-bin/text.cgi?%{REQUEST_URI}
Обратите внимание, что в этом случае, будет необходимо изменить пути в коде скрипта!
Наконец, вот решение задачки, данной в предыдущей части этой публикации:
RewriteCond %{REMOTE_ADDR} ^212.37.64
RewriteRule ^.*$ - [F]
Если мы пишем в регулярном выражении "^212.37.64" вместо "^212.37.64." (с точкой в конце), то даст ли это тот же самый эффект, и будут ли исключены те же самые IP адреса?
Регулярное выражение ^212.37.64 удовлетворяет и применимо к следующим строкам:
212.37.64
212.37.640
212.37.641
212.37.64a
212.37.64abc
212.37.64.12
212.37.642.12
Следовательно, последняя цифра "4" может сопровождаться любой символьной строкой. Однако, максимальным значением IP является адрес 255.255.255.255 – который подразумевает, что например 212.37.642.12 – неправильный (недопустимый) IP. Единственный допустимый IP в вышеприведенном списке – 212.37.64.12!
Автор: Denveroid
Источник: SiteMaker.Ru

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

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

  1. спасибо за инфу!

    Комментарий от кб безопасности — Январь 10, 2007 @ 11:58 am

  2. Спасибо!

    Комментарий от Jason Hunter — Январь 19, 2007 @ 6:47 pm

  3. здорово!
    mod_rewrite — отличная и оч удобная щтука, тока копаться с ним времени всегда не хватает. а тут всё вполне доходчиво объяснено.
    спасибо!

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

  4. Спасибо! Нашёл именно то, что мне было нужно!

    Комментарий от oqbo — Декабрь 16, 2007 @ 5:39 pm

  5. Подскажите плз - как можно добавить такой диапазон айпи в RewriteCond: 85.167.16.0 - 85.167.31.255 ?

    Комментарий от Pavel — Январь 19, 2008 @ 7:43 am

  6. >>Подскажите плз - как можно добавить такой диапазон айпи в RewriteCond: 85.167.16.0 - 85.167.31.255 ?
    ^85\.167\.{16,31}\.{0,255}
    примерно так…

    Комментарий от wAX — Февраль 6, 2008 @ 4:13 pm

  7. Информация полезная, спасибо.
    Правда, поисковикам давным-давно уже все равно, динамические урлы, или статические.

    Комментарий от Кильдим — Февраль 24, 2008 @ 4:06 am

  8. Ну наконец-то что-то полезное.

    Комментарий от народный кулинар — Июнь 25, 2008 @ 4:00 pm

  9. Соглашусь с Кильдимом - с развитием поисковиков mod_rewrite в этом плане стремительно теряет полезность.

    Комментарий от Собака в комнате — Август 29, 2008 @ 5:37 pm

  10. Спасибо большое за инфу!!! Респект!
    _______________________
    /go.php?url=/go.php?url=http://lesoman.ru/

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

  11. Как раз думал как смотреть роботов.Респект!

    Комментарий от Алексей — Сентябрь 3, 2008 @ 10:56 pm

  12. ОЧередная классная статья, которую ждал! Спасибо!
    ___________________________
    /go.php?url=http://www.virginiablueridge.com/

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

  13. Соласен ! Сов семи по поводу статьи! КЛАСС! 5 баллов!
    ___________________________
    /go.php?url=http://www.kidsholidaycards.org/

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

  14. Спасибо, в создании ЧПУ сильно помогло.

    Комментарий от Alexander — Октябрь 3, 2008 @ 9:27 pm

  15. И собственно таким образом используется RewriteRule для переадресации посетителей к определенным файлам. А вот с кодом посложнее немного.

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

  16. Надеюсь последняя =)

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

  17. Нет еще по идее есть пару частей

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

  18. Правда, поисковикам давным-давно уже все равно, динамические урлы, или статически

    Комментарий от Тамара — Октябрь 26, 2008 @ 7:46 pm

  19. Ну не совсем в принципе.

    Комментарий от Гаврила — Октябрь 26, 2008 @ 7:47 pm

  20. Очень полезная инфа. Долго искал

    Комментарий от удаленный переводчик — Октябрь 30, 2008 @ 8:12 pm

  21. Теперь на сайте буду адреса менять

    Комментарий от Лаго-Наки — Октябрь 30, 2008 @ 8:14 pm

  22. Очень полезная и практическая статья. Мод-реврайт - всегда узкое место у людей

    Комментарий от Никола Тесла — Октябрь 30, 2008 @ 8:14 pm

  23. Спасибо, в создании ЧПУ сильно помогло.

    Комментарий от zerx — Ноябрь 5, 2008 @ 10:13 pm

  24. RewriteEngine on обязательно включать?

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

  25. А вы уверены что он будет корректно работать ?

    Комментарий от Насос — Ноябрь 14, 2008 @ 11:20 pm

  26. модуль применим только к Апаче ? А вордпресс ?

    Комментарий от assets — Ноябрь 15, 2008 @ 5:57 pm

  27. Это касается только виртуальных магазинов и подобных ?

    Комментарий от Строитель — Ноябрь 27, 2008 @ 7:23 pm

  28. Хм..неплохо получается, будем юзать эту фунцию

    Комментарий от Француз — Ноябрь 28, 2008 @ 7:37 pm

  29. класнно написано

    Комментарий от Александра — Декабрь 22, 2008 @ 11:04 pm

  30. Мне понравилось, пишите ещё!

    Комментарий от smilie — Январь 28, 2009 @ 12:11 am

  31. Достаточно сложно встроить в свой алгоритм.

    Комментарий от Граф — Январь 31, 2009 @ 3:34 pm

  32. mod_rewrite — отличная и оч удобная щтука, тока копаться с ним времени всегда не хватает. а тут всё вполне доходчиво объяснено.
    спасибо!

    Комментарий от Ярослав — Февраль 3, 2009 @ 7:39 pm

  33. Спасибо, в создании ЧПУ сильно помогло.

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

  34. Осилил все три части по мод_рерайту и подумал: хвала богам, что ЧПУ есть уже во всех более-менее приличных ЦМСках =))

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

  35. спасибо за титанический труд

    Комментарий от Диана — Февраль 17, 2009 @ 11:03 am

  36. Теперь, когда поисковик найдет страницу с подобными ссылками, он проиндексирует сайт без всяких видимых проблем.

    Комментарий от Анатолий — Февраль 27, 2009 @ 11:12 pm

  37. Неплохая трилогия о мод_рерайте получилась. Собрал воедино и распечатал, пригодится в качестве справочного материала.

    Комментарий от Softblogger — Март 1, 2009 @ 10:12 pm

  38. Теперь, когда поисковик найдет страницу с подобными ссылками, он проиндексирует сайт без всяких видимых проблем.

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

  39. Валерий, откуда такая уверенность?

    Комментарий от Наталья — Март 6, 2009 @ 12:41 pm

  40. А обязательно ли нужно заменять все ссылки на сайте?

    Комментарий от Антон Иванович — Март 8, 2009 @ 9:54 am

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

    Комментарий от Адриана — Март 10, 2009 @ 10:03 pm

  42. Многие хостинг провайдеры, работающие с Apache предоставляют лог-файлы в общем формате. Это означает то, что они не будут соджержать поля с ссылающимися страницами и юзер-агентами.

    Комментарий от Тамара — Март 14, 2009 @ 3:37 pm

  43. Тамара, слишком заумно объясняете)

    Комментарий от Даниил — Март 30, 2009 @ 10:42 am

  44. Круто!

    Комментарий от Олег — Апрель 4, 2009 @ 1:21 pm

  45. 1

    Комментарий от Аркадий — Апрель 4, 2009 @ 1:22 pm

  46. А все ли поисковики принимают, понимают и индексируют URL, в которых содержится символ “?”?

    Комментарий от Настасия — Апрель 9, 2009 @ 3:13 pm

  47. статья превосходная, все разложено по полочкам у её автора наверное математический склад ума

    Комментарий от операционные системы клик — Апрель 17, 2009 @ 7:25 pm

  48. Спасибо за информацию!Буду осмыслять. :)

    Комментарий от bystrik — Апрель 20, 2009 @ 8:14 pm

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

You must be logged in to post a comment.

© apachedev.ru, 2005-2011