Як і всі користувачі інтернету, я з деякого часу (приблизно рік тому) став помічати, що все більше і більше популярних сайтів переходять від url виду http://site.net?pid=general&id=5&s=98465 на псевдостатику або на ЧПУ (Людині Зрозумілий УРЛ), тобто замість http://site.net?pid=general&id=5&s=98465 в рядку браузера буде щось схоже на http://site.net/general/45/5/98465/. І я став шукати документацію про те, що поки не розумів. Знайшов пару статей, в яких подібне робилося з допомогою .htaccess і 404 помилки, але це було не зовсім те, що мені потрібно і тоді мені випадково попався документація по mod_rewrite.

mod_rewrite – це спеціальний модуль для серверів Apache, який був спеціально зроблений для створення сайтів з ЧПУ. Він був написаний у квітні 1996 року і ексклюзивно подарований The Apache Group в липні 1997. Модуль являє собою бібліотеку розширення для серверів типу Apache. Знаходиться в папці modules, в кореневій папці апача і називається зазвичай mod_rewrite.so (встановлюється окремо). З допомогою mod_rewrite можна всього парою рядків .htaccess зробити зрозумілий для людини url. Для спрощення всіх команд і правил цей модуль використовує Perl-сумісні регулярні вирази. Наприклад, при використанні наступного правила:

RewriteRule ^([A-Za-z]+)/([0-9]+)$ index.php?dir=$1&s=$2 [L]

Запит виду http://site.net/shop/50/ розглядатиметься як сервером http://site.net/index.php?dir=shop&s=50 і плюс до всього контроль вводу значень, а це вже якась ніяка, але захист. Т. к. змінної dir може бути присвоєно толь значення з латинських букв, виключаючи символи, а змінної s тільки цілочисельні значення.

Для установки mod_rewrite вам потрібно його спочатку де-небудь завантажити, пошукайте в yandeks’е «mod_rewrite», обов’язково знайдете. Потім, відкриваєте папку з модулями апача, у мене це usr/local/apache/modules/ і скопіювати туди mod_rewrite.so. Потім заходите в папку usr/local/apache/conf/ і відкриваєте httpd.conf, знаходите сходинку #LoadModule rewrite_module modules/mod_rewrite.so і забираєте #. Якщо такого рядка немає, то додаєте цю сходинку в будь-яке місце. Потім нижче дописуєте RewriteEngine On, для того, що б це все працювало. А що б зміни набули чинності, вам слід перезапустити сервер.

Якщо у вас немає прав доступу до файлів apache, тоді звертайтеся до свого хостера з проханням або вимогою (у випадку якщо у вас платний хостинг) встановити активувати модуль mod_rewrite.so.

І ще одна порада на останок, перш ніж вносити зміни в httpd.conf, настійно рекомендую зробити його резервну копію, а то хіба мало що.

Як я вже говорив раніше, mod_rewrite використовується для перетворення запитів до сервера виду http://site.net/?dir=general&s=53 на http://site.net/general/53/. Це перетворення здійснюється за допомогою простого правила записаного в .htaccess:

RewriteRule ^([A-Za-z]+)/([0-9]+)$ index.php?dir=$1&s=$2

Сподіваюся, це все засвоїли. Переходимо до більш складних перетворень. Але для початку перерахую основні принципи при складанні правил для mod_rewrite:

* Спочатку йде назва методу (способу) перетворення:
o RewriteRule
o RewriteCond
o RewriteMap
o Змінні середовища apache
* Потім саме правило (Perl-сумісні регулярні вирази)
* І в кінці додаткові параметри:
o NC – регістронезалежне (без врахування регістру символів)
o OR – або, тобто якщо ця умова не виконується, перевіряється наступне за ним.
o L – перевірка на символічність посилання
o U – перевірка існування URL
o F – перевірка існування файлу

Mod_rewrite надає ще дуже багато чого цікавого, наприклад він може визначати тип браузера і в залежності від нього видавати потрібну сторінку:

RewriteCond %{HTTP_USER_AGENT} ^Mozilla.*
RewriteRule ^/$ /homepage.max.html [L]
RewriteCond %{HTTP_USER_AGENT} ^Lynx.*
RewriteRule ^/$
/homepage.min.html [L]
RewriteRule ^/$ /homepage.std.html [L]

Для написання свого правила потрібно небагато:

1. Придумати, як повинна виглядати рядок запиту в браузері
2. Реалізувати це.

Робиться це дуже просто, наприклад, у вас є сайт, на якому ви щось продаєте. І вам і вашим клієнтам було б набагато зручніше запам’ятовувати назви каталогів сайту, ніж змінні та їх параметри. Тому припустимо, що ваш майбутній сайт повинен мати таку структуру:

+—example.com
|
|—— articles/
| |—+-category1/
| |—+-category2/
|
|—— hardware/
| |—+-hdd/
| |—cd-rw/
| | |—produkt1/
| | |— produkt2/
| |—+-……….
| |
| |—+-other/
|
|—— about/

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

# Включаємо можливості mod_rewrite
RewriteEngine On
# Створюємо правила для розділів.
# Кожне нижче перераховане правило суворе і в ньому перевіряється
# тип змінних, це потрібно для захисту сайту від злому
# Для розділів (категорій)
RewriteRule ^([A-Za-z]+)/$ index.php?module=$1
# Для розділів і підрозділів
RewriteRule ^([A-Za-z]+)/([A-Za-z0-9]+)/$ index.php?module=$1&category=$2
# Для розділів, підрозділів та ідентифікатора
RewriteRule ^([A-Za-z]+)/([A-Za-z0-9]+)/([A-Za-z0-9.]+)$ index.php?module=$1&category=$2&id=$3

Тепер при запитах виду http://example.com/articles/category1/article12 буде викликатися http://example.com/index.php?module=articles&category=category1&id=article12

Але можна поступити і по-іншому:

# Включаємо можливості mod_rewrite
RewriteEngine On
# Створюємо правила для розділів
RewriteRule ^(.*)$ index.php [L,QSA]

В цьому випадку всі вхідні параметри повинен буде обробляти index.php. Робиться це так:

І в результаті виконання скрипта ми отримаємо всі параметри, отримані при розбитті запиту. Наприклад, запит:

http://example.com/articles/category1/article12.htm

після обробки скриптом в масиві $params буде міститися наступне:

Array
(
[0] => articles
[1] => category1
[2] => 12.htm
)

А далі вже все просто, в залежності від параметра [0] вибираємо той модуль, який нам потрібен і вантажимо його.

Продовження випливає. У наступній частині будуть розглянуті більш конкретні випадки.