Перейти к содержимому

Welcome to 100NT форум администраторов игровых серверов
Register now to gain access to all of our features. Once registered and logged in, you will be able to create topics, post replies to existing threads, give reputation to your fellow members, get your own private messenger, post status updates, manage your profile and so much more. If you already have an account, login here - otherwise create an account for free today!

Переключатель чата Чат

Добро пожаловать в чат 100NT
Horus : (17 May 2012 - 01:17 PM) гуф умер, а форум отжил свое.
Inkognit0 : (17 May 2012 - 01:08 PM) форум умер?
Изменить размер окна сообщений

Делаем Чпу На Сайте

- - - - -

Сообщений в теме: 7

#1
aninya

    Кавайная няка

  • Пользователи
  • 891 сообщений
  • ГородВеликие Луки
Reputation: 105
Сейчас я стал замечать у новичков сайтостроения тенденцию использовать ужастные урл типа ?page=1&act=trolololo
Простите это старый век.
Подойдем к этому с разных сторон. Для начала нам понадобиться сервер с поддержкой mod_rewrite или аналогичным функционалом.Это уже все современные браузеры поддерживают.
Можно пойти старым путем спрятать ?page=1&act=trolololo за правилами, где вебсервер разбирает URL и подставляет в этот УРЛ значения то есть типа /trolololo/1 через регулярное выражение /(/w+)/(/d+) подставляют в ?page=$2&?page=$1 , но это очень не красиво, есть более интересный вариант, разбирать все в скрипте то есть безусловно все перенаправлять на index.php и там разбирать. Ниже будет путь разбора
Читаем комментарии в коде
<?php
//Данные строки запроса храняться в REQUEST_URI
$url = $_SERVER['REQUEST_URI'];
//Первым делом нужно отсеч все $_GET значения
$uri = explode('?',$url);
в итоге у нас есть 2 части, собственно нам понадобиться только первая
Есть ленивый вариант для тех кому лень писать реврайты, используем http://server/index.php/trolololo/1
индентичной http://server/trolololo/1
if(strpos('index.php',$uri[0]) === 0){
//обрежем index.php
substr($uri[0],0,9);
}
//В итоге мы получили чистую запись например /trolololo/1

ну вот далее тут самое простое, 1ое вы можете пройтись в скрипте регулярными выражениями либо сделать
explode('/',$uri[0])
и полученную карту как наш пример
Аrray(
   [0]=>
   [1]=> trolololo
   [2]=> 1
)
грузить как модуль, действие и как вам вздумается.
Данный вариант рекомендуется использовать, для разгрузки вебсервера от лишних задач
Ну вам как дом.задание доработать и выявить все недочеты)

#2
Horus

    Продвинутый пользователь

  • Пользователи
  • 914 сообщений
  • ГородЗапорожье
Reputation: 117
Я так понял тут не полностью рабочий код, чтоб получить результат как у тебя переделал так
<?php
//Данные строки запроса храняться в REQUEST_URI
$url = $_SERVER['REQUEST_URI'];
//Первым делом нужно отсеч все $_GET значения
$uri = explode('?',$url);
if(strpos($uri[0],'index.php') === 1){
//обрежем index.php
$uri[0]=substr($uri[0],10);
}
//В итоге мы получили чистую запись например /trolololo/1
print_r(explode('/',$uri[0]));
?>

Изображение
Мы захватим этот мир, потому что мы инжир.

#3
aninya

    Кавайная няка

  • Пользователи
  • 891 сообщений
  • ГородВеликие Луки
Reputation: 105
Угу, я большую часть писал на коленки, собрать и поправить и было задание.
Так же проверил разделение?
по хорошему если первый символ в строке слеш, его обрезают что бы при explode в первый элемент массива попадал уже первая часть url
ну и по хорошему последний элемент массива проверяют на наличие например .html или .xml ну в зависимости от целей.и его обрезают, передавая в скрипт что есть расширение у "псевдофайла"

#4
Horus

    Продвинутый пользователь

  • Пользователи
  • 914 сообщений
  • ГородЗапорожье
Reputation: 117
сделал так но думаю что есть более оптимизированный способ
<?php
//Данные строки запроса храняться в REQUEST_URI
$url = $_SERVER['REQUEST_URI'];
//Первым делом нужно отсеч все $_GET значения
$uri = explode('?',$url);
if(strpos($uri[0],'index.php') === 1){
//обрежем index.php
$uri[0]=substr($uri[0],10);
}
//Обрезаем первый слеш
if(strpos($uri[0],'/') === 0){
$uri[0]=substr($uri[0],1);
}
$uri[0]=explode('/',$uri[0]);
//Разделяем через точку
$uri[0][count($uri[0])-1]=explode('.',$uri[0][count($uri[0])-1]);
print_r($uri);
//В итоге мы получили чистую запись например /trolololo/1
if (is_array($uri[0][count($uri[0])-1])){
echo 'type is '.$uri[0][count($uri[0])-1][count($uri[0][count($uri[0])-1])-1];
}
?>

на запрос http://check/index.php/trololo/1.php
результат
Array ( [0] => Array ( [0] => trololo [1] => Array ( [0] => 1 [1] => php ) ) ) type is php

Сообщение отредактировал Horus: 07 June 2011 - 14:15

Изображение
Мы захватим этот мир, потому что мы инжир.

#5
aninya

    Кавайная няка

  • Пользователи
  • 891 сообщений
  • ГородВеликие Луки
Reputation: 105
//Обрезаем первый слеш
if(strpos($uri[0],'/') === 0){
$uri[0]=substr($uri[0],1);
}

можно заменить
//Обрезаем первый слеш
if($uri[0][0] == '/'){
$uri[0]=substr($uri[0],1);
}

Вроде или $uri[0][1]
ведь к строке можно обратиться как к массиву
PS
в итоге ты можешь потом например загрузить
module/$uri[0]/loader.php
и выполнить например там функцию из $uri[1] и если его нет то выполнить например метод main() или init() ну это тебе решить как это сделать.
Твой вариант разрезания самый простой и быстрый, отделения расширения, если проверка на конкретное то можно strpos или аналогами тут полет фантазий.
Еще был вариант с массивом где ключ регулярка, а значение это модуль и метод например
$map['^(\w+)\.html$']=array('pages','view_page');
и тд) полет фантазии)))

Сообщение отредактировал aninya: 07 June 2011 - 15:13


#6
aninya

    Кавайная няка

  • Пользователи
  • 891 сообщений
  • ГородВеликие Луки
Reputation: 105
для более яркого примера у тебя может быть такой вариант
есть
class trololoController {

 public $ext;

 public function indexAction(){
  echo 'index';
 }

 public function viewAction(){
  echo 'view';
 }

 public function __call($name,$args){
  echo '404 not found';
 }

}


и после разбора
Наличие и загрузку оставлю на тебя
$controller = $uri[0].'Controller';
$cntrl = new $controller;
$cntrl->ext = $extension;
$method = (isset($uri[1])):$uri[1]?'index';
$method .='Action';
$cntrl->$method();
ну и тд :)
ЗЫ в синтаксисе могут быть ошибки просьба не винить) пишу на коленке

Сообщение отредактировал aninya: 07 June 2011 - 15:23


#7
Михаил(zenn)

    Продвинутый пользователь

  • Администраторы
  • 6827 сообщений
  • ГородКерчь
Reputation: 355
Эм, а зачем реализовывать велосипед если его уже придумали? Чем htaccess mod_rewrite не устраивает?

#8
aninya

    Кавайная няка

  • Пользователи
  • 891 сообщений
  • ГородВеликие Луки
Reputation: 105
mod_rewrite это велосипед
хорошим тоном считаеться что бы все запросы перенаправлять на index.php , там вести разбор, то есть в реврайтах всего одна строка, а не 10 как например в DLE

RewriteEngine On

# if a directory or a file exists, use it directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

# otherwise forward it to index.php
RewriteRule .* index.php
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L]

вот такое перенаправление, а разбор должен быть в index.php

Сообщение отредактировал aninya: 07 June 2011 - 16:15






Количество пользователей, читающих эту тему: 1

0 пользователей, 1 гостей, 0 скрытых пользователей