За последние 24 часа нас посетили 22739 программистов и 1273 робота. Сейчас ищут 786 программистов ...

ЧПУ - великое зло!

Тема в разделе "Прочие вопросы по PHP", создана пользователем dark-demon, 11 июл 2007.

  1. Anonymous

    Anonymous Guest

    Дада... авторы прекрасно следуют собственным утверждениям...
    я запомнил адрес этого материала.
     
  2. vb

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

    С нами с:
    6 июн 2006
    Сообщения:
    911
    Симпатии:
    0
    Адрес:
    Saint-Petersburg
    Горбунов Олег
    чтобы проще было запомнить
    google "ЧПУ web 2.0"

    з.ы. у меня вообще нет уверенности что это просто не перевод английского текста
     
  3. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    а вообще, XRI рулит ;-)
     
  4. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    в продолжение первого поста... реализовал сей чпу на практике:

    Код (Text):
    1. $prefix= dirname($_SERVER['SCRIPT_NAME']).'/';
    2. $pathinfo= substr($_SERVER['REQUEST_URI'],strlen($prefix));
    3. if (strpos($pathinfo,'index.php/')===0):
    4.     $pathinfo= substr($pathinfo,10);
    5.     $prefix.= 'index.php/';
    6. endif;
    7. $parts= array_filter(explode('/',$pathinfo));
    8. @list($handler,$uin)= explode(':',array_shift($parts));
    9. $params= array();
    10. if ($uin) $params[]= $uin;
    11. foreach ($parts as $n => $part):
    12.     $pair= explode(':',$part);
    13.     if (count($pair)==2):
    14.         $params[$pair[0]]= $pair[1];
    15.     else:
    16.         $params[]= $part;
    17.     endif;
    18. endforeach;
    19. $request= array();
    20. $request['prefix']= $prefix;
    21. $request['handler']= ifs (trim(strtr($handler,array('|'=>'/','..'=>'.')),'/'), 'catalog');
    22. $request['params']= $params;
    23. $request['post']= $_GET+$_POST;
    на выходе скрипта получаются следнующие данные:
    $request['prefix'] - это префикс для ссылок. например, если движок установлен в /uritest/ относительно корня сайта, то сей првефикс будет '/uritest/' (если mod_rewrite не поддерживается, то '/uritest/index.php/'). этот превикс может использоваться для генерации ссылок относительно корня сайта.
    $request['handler'] - идентификатор скрипта, который должен обработать запрос
    $request['params'] - вытащенные из урла параметры (индексно-ассоциативный массив)
    $request['post'] - данные полученные из формы.

    включение поддержки модреврайта осуществляется добавлением всего одной строчки в .htaccess:
    Код (Text):
    1. RewriteRule .*/$ index.php
    соответственно, если модреврайт включён, то ссылки должны быть вида: http://dark-demon.jino-net.ru/uritest/topic:about_uuu/
    , а если выключен, то:
    http://dark-demon.jino-net.ru/uritest/i ... about_uuu/
    вот и вся разница.
    впрочем, второй вариант работает даже при включённом реврайте...

    при формировании ссылок - просто используйте $request['prefix'], в который будет содержать в данном случае либо:
    /uritest/
    ,либо:
    /uritest/index.php/
    соответственно

    пример по сложнее: http://dark-demon.jino-net.ru/uritest/p ... rial:soft/
    здесь "products" - идентификатор обработчика, и далее пары ключ-значение, из которых будет составлен массив $request['params']
    ключи можно опустить (не рекомендуется, но иногда это необходимо): http://dark-demon.jino-net.ru/uritest/c ... t/win/net/
    ключами в массиве соответственно будут номера соответствующих значений.
    замечу, что catalog - это обработчик по умолчанию, соответственно вместо последней сылки лучше использовать один из следующих вариантов:
    http://dark-demon.jino-net.ru/uritest/:/soft/win/net/
    http://dark-demon.jino-net.ru/uritest/|/soft/win/net/
    (upd: опа, последний вариант лучше не использовать связи с глюками в пхпбб :) )

    также поддерживается такой синтаксис: http://dark-demon.jino-net.ru/uritest/t ... about_all/
    , который равносилен такому: http://dark-demon.jino-net.ru/uritest/t ... about_all/
    , но второй вариант не рекомендуется, потому как пользователь может стереть "flame_about_all/" надеясь попасть на уровень выше, но получит ошибку, что "идентификатор не найден" или что-нибудь в этом духе. первый же вариант представляет из себя цельную пару.

    ну в общем, спрашивайте, если что не понятно, а то мне сложно это рассказывать :)

    чуть позже сделаю функцию для обратного преобразоания.. .мож даже класс замучу...
     
  5. Sergey89

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

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Код (Text):
    1. ifs
    ?
     
  6. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    а, сорри.

    Код (Text):
    1. function ifs( ) {
    2.     foreach( func_get_args() as $arg ) if( $ret= $arg ) break;
    3.     return $ret;
    4. }