В предыдущей части статьи мы рассмотрели основные принципы работы
mod_rewrite. В этой статье будут рассмотрены
общие случаи использования mod_rewrite и его
возможностей.
Как я уже
говорил раньше, 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:
- Сначала идет название
метода (способа) преобразования:
- RewriteRule
- RewriteCond
- RewriteMap
- Переменные среды apache
- Потом само правило
(Perl-совместимое
регулярное выражение)
- И в
конце дополнительные параметры:
- NC
– регистронезависимо (без учета регистра символов)
- OR
– или, т.е. если это условие не выполняется, проверяется следующее за
ним.
- L – проверка на символичность ссылки
- U – проверка существования URL
- 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]
Для
написания своего правила нужно немного:
- Придумать, как должна
выглядеть строка запроса в браузере
- Реализовать это.
Делается это очень просто,
например, у вас есть сайт, на котором вы что-либо продаете. И вам и вашим
клиентам было бы гораздо удобнее запоминать названия каталогов сайта, нежели
переменные и их параметры. Поэтому предположим, что ваш будущий сайт должен
иметь такую структуру:
+-----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. Делается это так:
<?php
/* Функция для очистки
массива от пустых строк */
function Clear_array($array)
{
$c=sizeof($array);
$tmp_array=array();
for($i=0; $i<$c; $i++)
{
if (!(trim($array[$i])==""))
{
$tmp_array[]=$array[$i];
}
}
return
$tmp_array;
}
$param=$_SERVER['REQUEST_URI'];
$params=explode("/",$param);
$params=Clear_array($params);
?>
И в результате выполнения
скрипта мы получим все параметры, полученные при разбиении запроса. Например,
запрос:
http://example.com/articles/category1/article12.htm
после обработки скриптом в массиве $params
будет содержаться следующее:
Array
(
[0]
=> articles
[1] => category1
[2] => 12.htm
)
А дальше уже все просто, в
зависимости от параметра [0] выбираем
тот модуль, который нам нужен и грузим его.
Продолжение следует. В следуещей
части будут рассмотренны более конкретные случаи.
Если у вас есть вопросы или дополнения, или вы просто с чем-то не согласны
пишите мне на gid87@mail.ru и заходите на мой
сайт http://www.gid.gorodok.net/