Общие случаи использования mod_rewrite

Тема в разделе "Mod Rewrite / htaccess / ЧПУ", создана пользователем dotsenko, 28 ноя 2008.

Статус темы:
Закрыта.
  1. dotsenko

    dotsenko

    Регистр.:
    27 дек 2006
    Сообщения:
    233
    Симпатии:
    106
    Как я уже говорил раньше, mod_rewrite используется для преобразования запросов к серверу вида http://site.net/?dir=general&s=53 на http://site.net/general/53/. Это преобразование выполняется с помощью простого правила записанного в .htaccess:


    ewriteRule ^([A-Za-z]+)/([0-9]+)$ index.php?dir=$1&s=$2
    адеюсь, это все усвоили. Переходим к более сложным преобразованиям. Но для начала перечислю основные принципы при составлении правил для mod_rewrite:
    Сначала идет название метода (способа) преобразования:
    RewriteRule
    RewriteCond
    RewriteMap
    Переменные среды apache
    Потом само правило (Perl-совместимое регулярное выражение)
    И в конце дополнительные параметры:
    NC – регистронезависимо (без учета регистра символов)
    OR – или, т.е. если это условие не выполняется, проверяется следующее за ним.
    L – проверка на символичность ссылки
    U – проверка существования URL
    F – проверка существования файла
    od_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);
    ?>
    И в результате выполнения скрипта мы получим все параметры, полученные при разбиении запроса. Например, запрос:
    ttp://example.com/articles/category1/article12.htm
    осле обработки скриптом в массиве $params будет содержаться следующее:
    rray
    (
    [0] => articles
    [1] => category1
    [2] => 12.htm
    )
    дальше уже все просто, в зависимости от параметра [0] выбираем тот модуль, который нам нужен и грузим его.
    родолжение следует. В следуещей части будут рассмотренны более конкретные случаи.
    сли у вас есть вопросы или дополнения, или вы просто с чем-то не согласны пишите мне на gid87@mail.ru и заходите на мой сайт http://wm-help.net/
     
    blackace, lordBlack и lift нравится это.
Статус темы:
Закрыта.