ЧПУ для john

1.2K
.
(\/)____o_O____(\/)

ramzes, да preg_replace и два массива

.
# Koenig (27.11.2015 / 16:39)
ramzes, да preg_replace и два массива
реврайт заипешься прописывать. не соблюдается даже порядок акт\мод\ид
не получается сделать его универсальным
.
# Koenig (27.11.2015 / 16:39)
ramzes, да preg_replace и два массива
перечислять все ссылки не вариант. надо именно разделять на элементы.
+ в хитаччесе писать много правил придется
+ фиксить потерю линков на статику, графику и стили
.
ramzes

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

php (+/-)

<?php
/**



*/

define('REWRITE', true);


if(file_exists($_SERVER['DOCUMENT_ROOT'].'/theme/'.$set_user['skin'].'/index.php')){
include($_SERVER['DOCUMENT_ROOT'].'/theme/'.$set_user['skin'].'/index.php');
}


function getRewritePattern(){

$pattern = array(
'#/users/profile\.php\?act=([a-z_]+)#',
'#profile\.php\?act=([a-z_]+)#',
'#profile\.php\?user=#',
'#(&amp;|\?)user=#',
'#(&amp;|\?)mod=#',

'#/(panel|forum)/index\.php\?act=([a-z_]+)&amp;id=([\d]+)#',
'#/(panel|forum)/index\.php\?act=([a-z_]+)#',

'#forum/index\.php\?id=([\d]+)#',

'#&amp;page=([\d]+)#',

'#../mail/index\.php\?act=([a-z_]+)#',

'#\.\./(files|images)#',

'#/&amp;#'
);

$replace = array(
'/users/$1',
'/users/$1',
'/users/profile/',
'/',
'/mod.',

'/$1/act.$2/$3',
'/$1/act.$2',

'forum/$1',

'/page.$1',
'/mail/act.$1',

'/$1',

'/?'
);


preg_match('#^/([a-z]+)/#i', $_SERVER['REQUEST_URI'], $module);

switch($module[1]){

case 'forum':

$pattern[] = '#"index\.php"#';
$pattern[] = '#"index\.php\?id=([\d]+)"#';
$pattern[] = '#"index\.php\?id=([\d]+)&amp;page=([\d]+)"#';
$pattern[] = '#"index\.php\?id=([\d]+)&amp;start=([\d]+)"#';

$pattern[] = '#"\?id=([\d]+)"#';
$pattern[] = '#\&amp;start=([\d]+)#';
$pattern[] = '#\&amp;page=([\d]+)#';

$pattern[] = '#"index\.php\?act=([a-z_]+)"#';
$pattern[] = '#index\.php\?act=([a-z_]+)&amp;id=([\d]+)#';
$pattern[] = '#\?act=([a-z_]+)&amp;id=([\d]+)#';

$pattern[] = '#"search\.php"#';
$pattern[] = '#search\.php\?id=([\d]+)#';



$replace[] = '/forum/';
$replace[] = '/forum/$1';
$replace[] = '/forum/$1/page.$2';
$replace[] = '/forum/$1/start.$2';

$replace[] = '/forum/$1';
$replace[] = '/start.$1';
$replace[] = '/page.$1';

$replace[] = '/forum/act.$1';
$replace[] = '/forum/act.$1/$2';
$replace[] = '/forum/act.$1/$2';


$replace[] = '/forum/search';
$replace[] = '/forum/search/$1';

break;

case 'users':


break;

case 'panel':

$pattern[] = '#/panel/index.php?act=([a-z_]+)#';

$replace[] = '/panel/$1';

break;

case 'mail':

break;

}


return array(
'pattern' => $pattern,
'replace' => $replace
);
}

function rewriter_replace($content){

if(function_exists('theme_replace')){
$content = theme_replace($content);
}

if(REWRITE){
$data = getRewritePattern();
$content = preg_replace($data['pattern'], $data['replace'], $content);
}
return $content;
}



if(REWRITE){

if(strpos($_SERVER['REQUEST_URI'], '?')!=false AND isset($_SESSION['rePost'])){

preg_match('#(index|profile)\.php(.*)#', $_SERVER['REQUEST_URI'], $url);

header("Location: ".str_replace('"', '', rewriter_replace('"'.str_replace('&', '&amp;', $url[0]).'"')));
}

if($_SERVER['REQUEST_METHOD']=='POST'){
$_SESSION['rePost'] = true;
if(isset($_SESSION['reset_ok'])){
$_SESSION['r__'] = array(
'key'   => 'reset_ok',
'value' => $_SESSION['reset_ok']
);
}
if(isset($_SESSION['set_ok'])){
$_SESSION['r__'] = array(
'key'   => 'set_ok',
'value' => $_SESSION['set_ok']
);
}
}else if(isset($_SESSION['rePost'])){

if(isset($_SESSION['r__'])){
$_SESSION[$_SESSION['r__']['key']] = $_SESSION['r__']['value'];
unset($_SESSION['r__']);
}


unset($_SESSION['rePost']);
}



}

htaccess (+/-)

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteBase /

# panel
RewriteRule ^panel/([a-z_]+)$ /panel/index.php?act=$1 [L,QSA]
RewriteRule ^panel/([a-z_]+)/mod.([a-z_]+)$ /panel/index.php?act=$1&mod=$2 [L,QSA]
RewriteRule ^panel/([a-z_]+)/mod.([a-z_]+)$ /panel/index.php?act=$1&mod=$2 [L,QSA]
RewriteRule ^panel/([a-z_]+)/mod.([a-z_]+)/id\.([\d]+)$ /panel/index.php?act=$1&mod=$2&id=$3 [L,QSA]

#forum

RewriteRule ^forum/([\d]+)$ /forum/?id=$1 [L,QSA]
RewriteRule ^forum/act\.([a-z_]+)$ /forum/?act=$1 [L,QSA]
RewriteRule ^forum/act\.([a-z_]+)/([\d]+)$ /forum/?act=$1&id=$2 [L,QSA]
RewriteRule ^forum/([\d]+)/page.([\d]+)$ /forum/?id=$1&page=$2 [L,QSA]
RewriteRule ^forum/([\d]+)/start.([\d]+)$ /forum/?id=$1&start=$2 [L,QSA]
RewriteRule ^forum/act\.([a-z_]+)/([\d]+)/(start|page)\.([\d]+)$ /forum/?act=$1&id=$2&$3=$4 [L,QSA]
RewriteRule ^forum/search$ /forum/search.php [L,QSA]
RewriteRule ^forum/search/([\d]+)$ /forum/search.php?id=$1 [L,QSA]


#users
RewriteRule ^users/([a-z]+)$ /users/profile.php?act=$1 [L,QSA]
RewriteRule ^users/([a-z]+)/([\d]+)$ /users/profile.php?act=$1&user=$2 [L,QSA]
RewriteRule ^users/([a-z]+)/page.([\d]+)$ /users/profile.php?act=$1&page=$2 [L,QSA]
RewriteRule ^users/([a-z]+)/([\d+])/page.([\d]+)$ /users/profile.php?act=$1&user=$2&page=$3 [L,QSA]

RewriteRule ^users/([a-z_]+)/(mod|id|user)\.([a-z_]+)$ /users/profile.php?act=$1&$2=$3 [L,QSA]
RewriteRule ^users/([a-z_]+)/(mod|id|user)\.([a-z_]+)/([\d]+)$ /users/profile.php?act=$1&$2=$3&user=$4 [L,QSA]
RewriteRule ^users/([a-z_]+)/(mod|id|user)\.([a-z_]+)/([\d]+)/page.([\d]+)$ /users/profile.php?act=$1&$2=$3&user=$4&page=$5 [L,QSA]
RewriteRule ^users/([a-z]+)/([\d]+)/([a-z\d]+)$ /users/profile.php?act=$1&user=$2&type=$3 [L,QSA]

#mail

RewriteRule ^mail/act\.([a-z]+)$ /mail/?act=$1 [L,QSA]


#other

RewriteRule /user\.([\d]+)$ &user=$1 [L,QSA]
RewriteRule id/([\d]+)$ &id=$1 [L,QSA]

RewriteRule page.([\d]+)$ &page=$1 [L,QSA]
</IfModule>
.
(\/)____o_O____(\/)

ramzes, что то опять отступы побило

.

ramzes, спасибо. Очень интересно. Буду изучать и к себе прикручивать

.

Intelligent, он незаконченный. там надо додумывать логику, т.к. реврайт не железно прописан, а что то типа микро-правил.
для профиля, для форума, и т.д.
__
отступы не побило, это я так копировал неудачно

.
# ramzes (21.12.2015 / 13:18)
Intelligent, он незаконченный. там надо додумывать логику, т.к. реврайт не железно прописан, а что то типа микро-правил.
для профиля, для форума, и т.д.
__
отступы не побило, это я так копировал н
Рамзес пж закончи код)оч нужно
.

слишком много гемора, оно того не стоит. в частности надо перехватывать все редиректы после _пост и перенаправлять, это реально геморно, я недостаточно хорошо знаю джон, что бы отловить все такие моменты

.
wapper

Никто из вас не может сделать ЧПУ ссылки для джона? )

Смотрите как эти обычные непонятные длинные ссылочки ссылки портят все)

наверное многие на это не обращают внимания но меня это очень раздражает честно)

и мой сайт не вап тематики, а форум интернет магазина

Прикрепленные файлы:
Всего: 34