За последние 24 часа нас посетили 17898 программистов и 1610 роботов. Сейчас ищут 947 программистов ...

RewriteRule

Тема в разделе "PHP для новичков", создана пользователем ZEVeS, 3 дек 2008.

  1. ZEVeS

    ZEVeS Активный пользователь

    С нами с:
    3 дек 2008
    Сообщения:
    11
    Симпатии:
    0
    в .htaccess (находиться в /)

    файл test.php там же
    <?php
    print_r($_GET);
    ?>

    RewriteEngine On

    RewriteRule ^(.*)/? test.php?one=$1 [L]


    Проблема: набираю в адресной строке http://hostname.ru/la-la-la/tam-tam-tam/ (... и тому подобное. Cоответственно этих папок реально нет)

    в ответ получаю файл с таким содержанием
    Array ( [one] => test.php )

    я ожидал получить что-то вроде([one] = > /la-la-la/tam-tam-tam/)
     
  2. sylex

    sylex Активный пользователь

    С нами с:
    9 ноя 2008
    Сообщения:
    625
    Симпатии:
    0
    Адрес:
    Омск
    и не получишь... GET - это GET. Тебе нужно парсить $_SERVER['REQUEST_URI']
     
  3. ZEVeS

    ZEVeS Активный пользователь

    С нами с:
    3 дек 2008
    Сообщения:
    11
    Симпатии:
    0
    приведи пример кода?
     
  4. ZEVeS

    ZEVeS Активный пользователь

    С нами с:
    3 дек 2008
    Сообщения:
    11
    Симпатии:
    0
    кстати, ещё не понятно мне: если прописать так RewriteRule ^la-la-la/([^/]+)/?.* ... - то результат такой какой мне нужен, только меня такой вариант не устраивает - у меня может меняться "la-la-la"
     
  5. sylex

    sylex Активный пользователь

    С нами с:
    9 ноя 2008
    Сообщения:
    625
    Симпатии:
    0
    Адрес:
    Омск
    в рамках модели MVC, попробуй разберись. Типа пытаемся загрузить контроллер начиная с конца, проходим по всему пути.

    PHP:
    1. <?php
    2.         // take real URI
    3.         list($_URI,$_QUERY) = explode("?", $_SERVER['REQUEST_URI']);
    4.         // remove file extension and trailing backslash
    5.         $_URI = preg_replace("/\.[\w]{3,}$/i","",trim($_URI," /"));
    6.         $params = explode("/", $_URI);
    7.         // make environment
    8.         $ENV['URI'] = $params;
    9.         $ENV['SCRIPT'] = null;
    10.         $ENV['INPUT'] = array();
    11.         // find real requested file
    12.         for ( $i=sizeof($params); $i > 0; $i-- ) {
    13.             $path = implode(DSR,array_slice($params,0,$i));
    14.             /*
    15.             TODO: make user routing
    16.             */
    17.             // check real path
    18.             if ( is_file(CTRL . $path . EXT) ) {
    19.                 $ENV['SCRIPT'] = $path;
    20.                 $ENV['INPUT'] = is_array($parce) ? array_reverse($parce) : null;
    21.                 break;
    22.             }
    23.             // check index file on given path
    24.             elseif ( is_file(CTRL . $path . DSR . "index" . EXT) ) {
    25.                 $ENV['SCRIPT'] = $path . DSR . "index";
    26.                 $ENV['INPUT'] = is_array($parce) ? array_reverse($parce) : null;
    27.                 break;
    28.             }
    29.             // assign as variable and try next
    30.             else {
    31.                 $parce[] = $params[$i-1];
    32.             }
    33.         }
    34. ?>
     
  6. ZEVeS

    ZEVeS Активный пользователь

    С нами с:
    3 дек 2008
    Сообщения:
    11
    Симпатии:
    0
  7. ZEVeS

    ZEVeS Активный пользователь

    С нами с:
    3 дек 2008
    Сообщения:
    11
    Симпатии:
    0
    Насколько я знаю я могу использовать данные из шаблона в RewriteRule в подастановке в виде $0 (|1|2|...|n)
    А в данном случае у меня получается так что - RewriteRule обратная_связь - берет данные не из шаблона а из строки подстановки... а ещё точнее берет данные физического расположения а не url'а. Вот это я никак и не пойму почему?
     
  8. ZEVeS

    ZEVeS Активный пользователь

    С нами с:
    3 дек 2008
    Сообщения:
    11
    Симпатии:
    0
    Закрываю тему, я нашел решение:

    в .htaccess
    RewriteEngine On
    RewriteRule ^index\.php.* - [L]
    #RewriteRule ^index2\.php.* - [L] ---- это если на отдельную страницу захотца :)
    RewriteRule ^([^/]*)/?([^/]*)/?([^/]*)/?.* index.php?menu_level0=$1&menu_level1=$2&menu_level2=$3 [L]
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    в httpd.conf
    RewriteEngine On
    RewriteRule ^([^/]*)/?([^/]*)/?([^/]*)/?.* index.php?menu_level0=$1&menu_level1=$2&menu_level2=$3 [L]
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    Когда сервер обрабатывает .htaccess - он делает круг и опять заходит в него но уже с измененным урлом - для этого я поставил "RewriteRule ^index\.php.* - [L]"

    Если это прописывать на уровне конфигурационного файла - то он не возвращается обратно а сразу направляет по измененному адресу.

    Прошу прощения - если это не совсем php-ая тема была, но по-моему актуальна для web программирования.