Багато починаючі веб-майстри зустрічаються з проблемою обробки довгих адрес в рядку браузера. Наприклад, у вас є динамічна сторінка, яка обробляє запити на скачування файлів, з адресою виду http://www.my-site.com.ua/cgi-bin/download/get-files.cgi.

Для обробки файла потрібно ввести категорію файлу (наприклад, «мої файли» — id=my-files) і назву (наприклад, name=My_Editor), після чого у нас вийде щось на зразок http://www.my-site.com.ua/cgi-bin/download/get-files.cgi?id=my-files&name=My_Editor.

Погодьтеся, такий вид вкрай незручний для кінцевого користувача, особливо якщо адреса йому доводиться вводити вручну. Уникнути подібних складнощів можна за допомогою інструменту mod_rewrite із стандартного набору сервера Apache (http://www.apache.org/). Він дозволяє створену вище конструкцію перетворити на запис зразок http://www.my-site.com.ua/my-files/dn_pg=My_Editor.

Або ось ще один приклад. Припустимо, вам треба вивести статистичні дані про роботу компанії за кожен місяць.

Якщо не використовувати mod_rewrite, то сторінка буде мати вигляд зразок http://www.my-site.com.ua/cgi-bin/statistic.cgi?year=2000?month=06. Але все це можна представити значно простіше: http://www.my-site.com.ua/stat/2000/06. Подібних прикладів використання mod_rewrite можна навести безліч, тому не будемо довго просторікувати про теорії, а швидше перейдемо до практики.

Отже, приступимо до створення простих адрес. Для початку потрібно з’ясувати, чи підтримує ваш сервер mod_rewrite. Якщо ви користуєтеся платним хостингом, зверніться в службу підтримки або до адміністратора сервера з проханням уточнити цей момент і в разі чого додати таку можливість.

Якщо ж ви використовуєте безкоштовний хостинг, то доведеться вас засмутити — напевно, у вас нічого не вийде . Правда, є й приємні винятки — «забугорні» hypermart.net і virtuave.net.

Тепер давайте розберемося з процедурою встановлення перенаправлень. Всі дані про нових URL-адреси потрібно прописувати в файл .htaaccess, який слід розмістити в основному каталозі сервера, причому закачувати його на сервер потрібно в двійковому форматі. Спочатку документа пропишіть такі рядки:

Options ExecCGI FollowSymLinks Includes MultiViews
RewriteEngine on

Далі в кожному рядку вказується правило перенаправлення. Припустимо, нам потрібно зробити перенаправлення з http://www.my-site.com.ua/cgi-bin/download/get-files.cgi?id=xxx&name=xxx на http://www.my-site.com.ua/xxx/dn_pg=xxx. Приписуємо в .htaaccess такий рядок:

RewriteRule ^/(.+)/dn_pg=(.+) /cgi-bin/download.cgi?id=$1&name=$2 [T=application/x-httpd-cgi,L]

Тепер давайте трохи розберемося з синтаксисом побудови вказівок. Команда RewriteRule вказує серверу на перенаправлення, ^/(.+)/dn_pg=(.+) — який запит перенаправляти, /cgi-bin/download.cgi?id=$1&name=$2 — реальний адресу перенаправлення, нарешті, [T=application/x-httpd-cgi,L] вказує на CGI/Perl-скрипт.

Тепер задамо правило для перенаправлення з другого прикладу:

Options ExecCGI FollowSymLinks Includes MultiViews
RewriteEngine on
RewriteRule ^stat/([0-9]+)/([0-9]+) /cgi-bin/statistic.cgi?year=$1&month=$2

Остання рядок задає формат, в даному випадку цифри від 0 до 9 — ([0-9]+), — і перенаправляє кожну цифру на відповідний адреса ($1,$2).

Запис ([0-9]+) свідчить про обробку тільки цифр, тобто букви порушуватися не будуть.

Також бувають ситуації, коли потрібно зробити редирект зі старої сторінки на нову. Ось приклад подібного сценарію:

Options ExecCGI FollowSymLinks Includes MultiViews
RewriteEngine on
RewriteBase /my-files/ # задаємо папку, в якій знаходився старий документ
RewriteRule ^old.html$ new.html # перенаправляємо з сторінки old.html на new.html

Бувають такі ситуації, коли потрібно, щоб початкова сторінка запускалася з безліччю параметрів (це коли ви використовуєте CGI — або PHP-скрипти і хочете, щоб при першому завантаженні сайту в них передавалися які-небудь дані).

Припустимо, ми будемо передавати дані з http://www.my-site.com.ua на http://www.my-site.com.ua/cgi-bin/index.cgi?topic=main&page=1. Щоб організувати такий редирект, нам потрібно прописати наступні рядки:

Options ExecCGI FollowSymLinks Includes MultiViews
RewriteEngine on
RewriteRule ^$ /cgi-bin/index.cgi?topic=main&page=1 [T=application/x-httpd-cgi,L]

Тепер, коли користувач набирає в рядку браузера http://www.my-site.com.ua, то він перенаправится на http://www.my-site.com.ua/cgi-bin/index.cgi?topic=main&page=1, але в рядку браузера раніше буде значитися адреса http://www.my-site.com.ua/.

Якщо додати в [T=application/x-httpd-cgi,L] параметр R, переспрямування буде явним, а не прихованим.

Тепер давайте зробимо складний переклад, наприклад, щоб перша сторінка (найчастіше це index.html) перенаправлялися на http://www.my-site.com.ua/home, а http://www.my-site.com.ua/home у свою чергу приховано виконувала CGI-скрипт з параметрами http://www.my-site.com.ua/cgi-bin/index.cgi?topic=main&page=1.

Для цього знову редагуємо файл .htaccess, в якому пишемо наступне:

Options ExecCGI FollowSymLinks Includes MultiViews
RewriteEngine on
RewriteRule ^$ /home [R]
RewriteRule ^index.html /home [R]
RewriteRule ^home$ /cgi-bin/index.cgi?topic=main&page=1 [T=application/x-httpd-cgi,L]
RewriteRule ^$ /home [R]

Спочатку перенаправляємо http://www.my-site.com.ua на home, далі index.html на той же home (на той випадок, якщо хто-небудь надумає набрати в рядку браузера http://www.my-site.com.ua/index.html) і в кінці перенаправляємо home на cgi-bin/index.cgi?topic=main&page=1.

Хочу зауважити одну важливу деталь — якщо в рядку браузера ввести http://www.my-site.com.ua/home/ (наприкінці додамо /), то користувач отримає помилку. Це пов’язано зі специфікою компонента mod_rewrite. Тому для таких ситуацій потрібно прописувати ще один рядок:

RewriteRule ^home/ /home [R]

Наостанок хочу сказати, що mod_rewrite можна використовувати і для більш складних завдань, наприклад для пошуку потрібних файлів в різних каталогах, а також для віртуальних доменів.