Псевдостатика (ModRewrite). Часть 2

Автор статьи: Беляев Александр aka gid ©
Сайт Автора: gid.gorodok.net
E-mail Автора: gid87@mail.ru
Дата публикации: 25.03.2006

       В предыдущей части статьи мы рассмотрели основные принципы работы 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]

            Для написания своего правила нужно немного:

  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. Делается это так:

<?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] выбираем тот модуль, который нам нужен и грузим его.

Продолжение следует. В следуещей части будут рассмотренны более конкретные случаи.

Если у вас есть вопросы или дополнения, или вы просто с чем-то не согласны пишите мне на [email protected] и заходите на мой сайт http://www.gid.gorodok.net/