Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Как применить mod_rewrite к существующему сайту


Автор: kulikoff 11.5.2011, 13:16
У меня такая ситуация: есть интернет-магазин, в котором урлы выглядят примерно так:
Код

http://www.mysite.com/good.php?good_id=5235&category_id=43


Стоит задача переделать как-то так, чтоб этот же урлы выглядел, как положено:
Код

http://www.mysite.com/good/5235/43


Вопрос: как это сделать или где-то можно получить исчерпывающую инфу про мой конкретный случай, а не о моде вобще и в принципе?

Автор: bars80080 11.5.2011, 13:38
ссылки ты делаешь сам. если магазин, как CMS, генерирует ссылки в автоматическом режиме, то нужно смотреть в настройки магазина, где задать новый шаблон ссылок, либо просто поставить галочку "использовать ЧПУ"

mod_rewrite нужен, когда кто-нибудь приходит по ссылке, тут надо распознать /good/5235/43 и отправить по адресу /good.php?good_id=5235&category_id=43

самый простой способ - перекидывать всех прямо в корень:

Код

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [L,QSA]


таким макаром все не найденные пути будут вести на http://www.mysite.com/index.php
а в файле index.php уже можно вытащить путь из $_SERVER['REQUEST_URI'], распарсить его и по полученным данным произвести подключение нужного модуля


но вообще, задача очень специфическая для движка. в общем плане не решается, и можно запороть весь движок

Автор: ksnk 11.5.2011, 15:40
Цитата(kulikoff @  11.5.2011,  13:16 Найти цитируемый пост)
есть интернет-магазин,

Все зависит от того, насколько он "правильно" сделан. В правильном магазине все ссылки формируются централизованно. В обычном - как получилось.

частное решение, которое может сработать, если более правильные методы неприменимы:

Код

function link2chpu($m){
  $result=$m[2]; 
  $url=array();
  mb_parse_str($m[3],$url);
  foreach($url as $k=>$v)
    $result.='/'.$k.'/'.$v;

  return $m[1].'="'.$result.$m[4].'"';
}

function convert_href($s){
    return preg_replace_callback(
       '~(href|action)="(.*?)\?(.*?)(\#.*?)?"~',
       'link2chpu',$s);
}

ob_start('convert_href');

//$url='a href="xx?yy=zz&aa=bb#gohome"';
//$url='a href="xx"';
//$url='a href="xx?yy=zz"';
//echo $url.'<br>'.convert_href($url);


функцию link2chpu следует допилить напильником по месту. Да и варнинги, которые при ее выполнении формируются неплохо бы отработать.

Автор: Sanchezzz 11.5.2011, 15:46
Код

RewriteRule ^/good/(.*)/(.*)/$    /good.php?good_id=$1&category_id=$2[L]


вроде так

Добавлено @ 15:54
Я пользуюсь методом как сказал bars80080 только у меня это делает 1 файл
Код

 RewriteCond %{REQUEST_FILENAME} !/core/modrewrite.php$   # список реврайтов
 RewriteRule ^(.*)$ /core/core-modrewrite.php [L]

файл со структурой modrewrite.php...

 $Rewrite = array( array('RULE_EX'=> '#^/([a-z0-9\_]+)/([a-z0-9\_]+).html#' , 'RULE'=>'action=$1&fid=$2'  ,  'URL'=>'/index.php')  );

файл core-modrewrite.php 

обработка идет через перебор массива если нашли то include файл
Код

  $url = preg_replace($val["RULE_EX"], (strlen($val["URL"]) > 0 ? $val["URL"]."?" : "").$val["RULE"], $_SERVER["REQUEST_URI"]);






Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)