У двох попередніх частинах ми познайомилися з основами «правил перезапису 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 by 2000 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.64 a
212.37.64 abc
212.37.64.12
212.37.642.12

Отже, остання цифра «4» може супроводжуватися будь-символьним рядком. Однак, максимальним значенням IP адреса 255.255.255.255 – який увазі, що наприклад 212.37.642.12 – неправильний (неприпустиму) IP. Єдиний допустимий IP у вищенаведеному списку – 212.37.64.12!

Продовження слідує…