У двох попередніх частинах ми познайомилися з основами «правил перезапису 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!
Продовження слідує…