На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Serafim, fatalist
  
    > ЧПУ , Как сделано в соцсетях?
      Подскажите, может кто знает?
      Как сделано в известных соц.сетях, когда вводишь адрес:

      vn.com/vasya

      на самом деле отрабатывает

      vn.com/profile.php?id=vasya

      А если, наоборот, ввести адрес vn.com/profile.php?id=vasya
      то отобразится все равно vn.com/vasya

      Как они это делают?
        Цитата Grisha @
        на самом деле отрабатывает

        vn.com/profile.php?id=vasya

        С чего ты это решил? :huh:
          Цитата Serafim @
          С чего ты это решил? :huh:

          Ну конечно не именно так скрипт называется и путь может быть другой. Но у них явно не созданы папки на сервере под каждого пользователя ))
            Цитата Grisha @
            Ну конечно не именно так скрипт называется и путь может быть другой. Но у них явно не созданы папки на сервере под каждого пользователя ))

            Я спросил на тему - с чего ты решил, что роут как-то связан с аргументами и почему там какие-то преобразования есть. $_SERVER уже содержит информацию о самом роуте и никто не мешает её обрабатывать.

            Например:
            ExpandedWrap disabled
              $router->get('/{name}', 'MyController@action')->where('name', '\w+');


            Что означает: Если есть адрес, соответствующий паттерну "/\w+", то создать объект класса "MyController" и вызвать его метод "action", с передачей информации о запросе, поле "name" из роута и прочих данных (зависит от реализации).

            Добавлено
            Цитата Serafim @
            Например

            Ну это высокоуровневый пример, если на низком уровне, то происходит примерно следующее:
            ExpandedWrap disabled
              if (preg_match('/^\/(?P<name>\w+)$/isu', $_SERVER['REQUEST_URI'])) {
                 (new MyController)->action(...);
              }


            Добавлено
            P.S. Если рассматривать роутинг в рамках фреймов, то можно почитать тут:
            - https://laravel.com/docs/5.5/routing#basic-routing
            или тут:
            - https://symfony.com/doc/current/routing.html
              Задача решена. Спасибо всем откликнувшимся.
              Очень помогла статья http://gency.ru/single-entry-point

              Решил таким способом:
              Вклинился в корневой файл index.php, вставил вызов функции (при true сразу выхожу из index.php):

              ExpandedWrap disabled
                function checkUserAccount()
                {
                    $p=strtolower(preg_replace('#//+#','/',$_SERVER['REQUEST_URI']));
                    if (strlen($_SERVER['QUERY_STRING'])) $p=substr($p,0,-(strlen($_SERVER['QUERY_STRING'])+1));
                    if (count($pa=explode('/',$px=trim($p,'/'),2))<2) $pa[]='';
                    if ((count($pa) >= 1) and ($pa[0] является аккаунтом))
                    {
                        $_GET['id'] = $pa[0];
                        include './profile/index.php';
                        return true;
                    }
                    return false;
                }
                Цитата Grisha @
                Решил таким способом:

                Плохое решение. И что у тебя будет при: "http://site.com/vasya?id=23"?
                    Вот детальный переход с PHP на фреймворки и правильный роутинг
                    https://symfony.com.ua/doc/current/introduc...o_symfony2.html

                    Детальнее о роутере в Symfony
                    https://symfony.com.ua/doc/current/routing.html
                    0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                    0 пользователей:


                    Рейтинг@Mail.ru
                    [ Script execution time: 0,0253 ]   [ 16 queries used ]   [ Generated: 28.03.24, 13:05 GMT ]