Подскажите, может кто знает? Как сделано в известных соц.сетях, когда вводишь адрес: vn.com/vasya на самом деле отрабатывает vn.com/profile.php?id=vasya А если вручную ввести второй адрес, то отобразится все равно первый! Как они это делают?
Создал в корне сайта файл profile.php. При обращении к нему по полному пути (вида vn.com/profile.php?id=vasya) все хорошо. Вставил в .htaccess код: Код RewriteEngine On RewriteRule ^([^/]*)$ /profile.php?id=$1 [L] Стала выходить ошибка 500 Internal Server Error. Что-то я запутался...
Конечно это пример, скрипт и путь может быть любой. Но у них явно нет папки на сервере под каждого пользователя.
miketomlin, а где вклинить свой код роутинга? и не просто ведь нужен редирект, а полноценная подмена адреса в строке. Если вводят: vn.com/vasya vn.com/profile.php?id=vasya Всегда должен отрабатывать скрипт vn.com/profile.php?id=vasya А отображаться адрес должен только vn.com/vasya
@gritts80, а кто вам сказал, что на самом деле отрабатывает vn.com/profile.php?id=vasya ? Вы что ли нашли такой дубль или хакнули сайт? --- Добавлено --- P.S. Возможности Web-сервера для рерайта лучше использовать по минимуму. Обычно все запросы (быть может кроме статика, если конечно он не на отдельном хосте висит) направляются в один фронт, в котором парсится урл, как выше сказал Ganzal. --- Добавлено --- Парсинг может выполняться непосредственно по одной предопределенной маске, либо путем последовательного обхода списка роутов (масок), отсортированного по приоритету (роуты могут конфликтовать друг с другом; если срабатывает более приоритетный роут, менее приоритетрый уже не обрабатывается). --- Добавлено --- Зацикливание? --- Добавлено --- Либо слеш уберите в подстановке, либо добавьте условие, препятствующее зацикливанию. --- Добавлено --- Например: Код (Text): RewriteCond %{REQUEST_FILENAME} !-f Гляньте эту мою статью и этот мой коммент к ней.
вк ищет паге зарегистрированных страниц, и если не находит, он начнет выяснять условиями, а не юзер ли это а не хрень какая нибудь ?
miketomlin, огромное вам спасибо за статью, я понял, что можно организовать единую точку входа в index.php, частично уже сделал! Получилось отловить, когда введен адрес "vn.com/vasya". Единственный к вам вопрос, как внутри index.php сделать вызов profile.php?id=vasya ? Так чтобы не было перехода. При использовании "header('Location: http..." делается переход, меняется адрес в адресной строке браузера.
надо чтобы выглядело так: vn.com/vasya чтобы потом код понимал вот так: profile.php?id=vasya в итоге получили бы переменную с значением уася. зашкварно.. PHP: trim ( parse_url ( $_SERVER['REQUEST_URI'], PHP_URL_PATH ), ' /' ) explode first array value... [0]
Ну раз пошла такая пьянка, на Nginx парсим URL, передавая PHP-машине запрос уже в нормальном виде с гетами.
@gritts80, выше уже сказали, что нужно фантазию включить, и даже пример накидали. Зачем вам внутри index.php делать вызов profile.php?id=vasya ? Можете, например, внутри фронта подключить profile.php и передать туда в переменной $id первый компонент пути (vasya). Если вы про редирект в коде из статьи, то он для другого нужен.
А можно вообще забить на ЧПУ, потому что это дичь, придуманная СЕОшниками, верящими в мифы и предания, которые они сами же придумывать горазды. Это такой вот лайвхак - если не создавать себе проблемы, не придется их решать.
Задача решена. Спасибо всем откликнувшимся. Очень помогла статья http://gency.ru/single-entry-point Решил таким способом: Вклинился в корневой файл index.php, вставил вызов функции (при true сразу выхожу из index.php): Код (Text): 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; }
@gritts80, что-то присваивать элементам $_GET как-то не очень. Что мешает использовать $id, как я выше писал? Как минимум один элемент в массиве будет уже после explode (при обращении к главной в нем будет пустая строка), а после if (count($pa=... всегда будет ровно два (второй может содержать пустую строку). --- Добавлено --- if (strlen(... $p=... можно сделать попроще, например: Код (Text): list($p)=explode('?',$_SERVER['REQUEST_URI'],2); В оригинале преследовался тайный умысел, что для вас походу не актуально. Еще ф-цию parse_url гляньте.
@miketomlin вам спасибо огромное, только благодаря вам вообще смог решить эту задачу. столько дней уже бился над ней. как здесь вам плюс поставить? сейчас буду код улучшать ))