1.9.2001 12:52 Leo [] Как развивается данная проблема? |
1.10.2001 17:46 Peter A. Shushpanov [] А так не логичнее будет? Options Indexes Includes MultiViews FollowSymLinks RewriteEngine On RewriteRule ^([^/]+)/([^/]+)/([^/|.]*) /index.php?cat[1]=&cat[2]=&cat[3]=&%{QUERY_STRING} [S] RewriteRule ^([^/]+)/([^/|.]*) /index.php?cat[1]=&cat[2]=&%{QUERY_STRING} [L] |
2.11.2001 15:20 Анатолий [] Программирую не так давно, но хочется предложить совой способ разбора и проверки урлов. Очень хочется знать Ваше мнение по-поводу идеи и реализации, поэтому буду рад пообщаться в аське (45816202) или просто ответь на письма. 1) Как обычно, пишем в RewriteEngine On RewriteRule ^/.images(.*) /.images [L] - не хотим обрабатывать этот каталог. RewriteRule ^(.*) /index.php - ну например, перенаправляем все на index.php на этом вся работа с конфигами апача заканчивается. 2) создаем файлик типа site_structure.inc $site_urls = array ( "$net" => array( "default" => "$code_path/internet.html", '' => ' ', 'line'=> "$internet_path/line.html", 'hosting' => "$internet_path/hosting.html", "$reshenie" => array( "default" => "$code_path/recruiting.html", "" => " ", "aboutus" => "$recruiting_path/aboutus.html", ), ); а проще говоря многомерный массив, причем любой размерности. Вложенный массив является подурлами для родительского. 3) обрабатываем этот файлик. $modify_structure = File("$tmp_path/timestamp"); - временный файл с временем создания site_structure.inc if ($modify_structure[0] != filemtime("$code_path/.etc/site_structure.inc") !$modify_structure) Modify_struct(); include_once "$tmp_path/site_str.tmp"; function Modify_struct(){ global $Site_urls,$code_path,$tmp_path,$net,$reshenie,$internet_path,$recruiting_path,$includes_path,$root_path,$admin_path; $f= new File("$tmp_path/timestamp","w+",LOCK_EX); $f->Write(filemtime("$code_path/.etc/site_structure.inc")); $f->Close(); include_once "$code_path/.etc/site_structure.inc"; Site_structure($site_urls, 0,""); $tmp = " foreach($Site_urls as $k => $v) $tmp .= '$Site_urls["'.$k.'"] = "'.$v."";n"; $tmp .= "?>"; $f = new File("$tmp_path/site_str.tmp","w+",LOCK_EX); $f->Write($tmp); $f->Close(); } function Site_structure($site_urls, $level,$this_url){ global $Site_urls; foreach($site_urls as $k => $v){ if ($level == 0) $this_url = ""; if (is_array($v)){ $this_url .= $k."/"; Site_structure($v,$level+1,$this_url); } else{ $k = $this_url.$k; if ($k !== "$this_url") $k.="/"; $Site_urls[$k] = $v; } } } 4) выводим доступные урлы if ($Site_urls[$Url]){ $tmp_url = substr($Url,0,strlen($Url)-1); $tmp_url=explode("/",$tmp_url); foreach ($tmp_url as $k){ $tmp_url1 .= $k."/"; @include_once $Site_urls[$tmp_url1."default/"]; } @include_once $Site_urls[$Url]; unset($tmp_url); } else include_once "$code_path/404.html"; теперь немного про то, как это все работает. если файл timestamp не существует или время, которое в нем записано не совпадает с временем создания файла site_structure.inc, запускаем функцию обработки многомерного массива, где ключу соответсвует сам подурл, а значению - файл, который надо подлючить для вывода. вследствие чего создается еще один файл site_str.tmp с обычным ассоциативным массивом, где в качестве ключей выступают уже полные урлы (так сказать от корня), а в качестве значений файлы, которые надо подключить. После чего этот файл подключается обычным образом. Таким образом получается, что функции перестройки урлов запускаются только в том случае, если произошло изменение структуры сайта, а в противном случае ничего не происходит. При обработке используется урл "от корня" то есть в данном случае переменная $Url содержит значение $HTTP_HOST.$SCRIPT_URL Используется схема сборки, при которой в подурлах переопределяются значения некоторых переменных из родительских урлов, для этого и нужен default P.S. Вполне допускаю, а скорее даже не сомневаюсь в том, что данный код не совершенен и может быть доработан профессиональным программистом. Очень хочется знать Ваше мнение по поводу всего этого. |