Связь и интернет Архив Программирование
   
Сделать стартовойСделать закладку            
   ПОИСК  
   
Главная / Perl / Полезная информация /
8  Perl
8  PHP
8  JavaScript
8  HTML
8  DHTML
8  XML
8  CSS
8  C / C++
8  Pascal и Delphi
8  Турбо Ассемблер
8  MySQL
8  CASE-технологии
8  Алгоритмы
8  Python
8  Обратная связь
8  Гостевая книга
Новости о мире


Модуль mod_rewrite. Часть 3. - Программирование от RIN.RU
Модуль 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}


Обратите внимание, что в этом случае, будет необходимо изменить пути в коде скрипта!



 8  Комментарии к статье  8 8  Обсудить в чате

 
  
  
    Copyright ©  RIN 2003 - 2004      * Обратная связь