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

      vn.com/vasya

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

      vn.com/profile.php?id=vasya

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

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

        vn.com/profile.php?id=vasya

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

          Ну конечно не именно так скрипт называется и путь может быть другой. Но у них явно не созданы папки на сервере под каждого пользователя ))
          end;
            Цитата 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
            user posted image
              Задача решена. Спасибо всем откликнувшимся.
              Очень помогла статья 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;
                }
              end;
                Цитата Grisha @
                Решил таким способом:

                Плохое решение. И что у тебя будет при: "http://site.com/vasya?id=23"?
                user posted image
                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                0 пользователей:


                Рейтинг@Mail.ru
                [ Script Execution time: 0,0938 ]   [ 14 queries used ]   [ Generated: 26.09.17, 03:51 GMT ]