ЧПУ не могу ладу дать

J2
На сайте с 13.12.2011
Offline
46
715

Здравствуйте уважаемые. Помогите пожалуйста разобраться делаю чпу для интернет магазина название товара при добавлении пропускаю через функцию транслитерации и записываю в таблицу. Потом подключаю эту таблицу ссылка получается такого вида

http://test1.ru/shop/item-ob-yavlenie-budet-vydeleno-krasnym-cvetom-i-budet-otobrazheno-srazu-posle-nazvaniya-tovara-ob-yavlenie-ne-mozhet-byt-dlinnee-chem-100-simvolov-100000.html

Проблема вот в чем когда в транслите нет цифр то все отлично работает, а с цифрами нет.

Есть 2 файла которые обрабатывают эти ссылки.

Первый

function url($act = '', $op = '', $args = array(), $model = false, $site_url = ''){
//伪静态文件扩展名
$ext = '.html';
//入口文件名
$file = 'index.php';
// $site_url = empty($site_url) ? SHOP_SITE_URL : $site_url;
$act = trim($act);
$op = trim($op);
$args = !is_array($args) ? array() : $args;
//定义变量存放返回url
$url_string = '';
if (empty($act) && empty($op) && empty($args)) {
return $site_url;
}
$act = !empty($act) ? $act : 'index';
$op = !empty($op) ? $op : 'index';

$model = $model ? URL_MODEL : $model;

if ($model) {
//伪静态模式
$url_perfix = "{$act}-{$op}";
if (!empty($args)){
$url_perfix .= '-';
}
$url_string = $url_perfix.http_build_query($args,'','-').$ext;
$url_string = str_replace('=','-',$url_string);
}else {
//默认路由模式
$url_perfix = "act={$act}&op={$op}";
if (!empty($args)){
$url_perfix .= '&';
}
$url_string = $file.'?'.$url_perfix.http_build_query($args);
}
//将商品、店铺、分类、品牌、文章自动生成的伪静态URL使用短URL代替
$reg_match_from = array(
'/^goods-index-goods_translit-([a-z0-9-]+)-goods_id-([0-9]*)\.html$/', //делаю так
'/^show_store-index-store_id-(\d+)\.html$/',
'/^show_store-goods_all-store_id-(\d+)-stc_id-(\d+)-key-([0-5])-order-([0-2])-curpage-(\d+)\.html$/',
'/^article-show-article_id-(\d+)\.html$/',
'/^article-article-ac_id-(\d+)\.html$/',
'/^document-index-code-([a-z_]+)\.html$/',
'/^search-index-cate_id-(\d+)-b_id-([0-9_]+)-a_id-([0-9_]+)-key-([0-3])-order-([0-2])-type-([0-2])-area_id-(\d+)-curpage-(\d+)\.html$/',
'/^brand-list-brand-(\d+)-key-([0-3])-order-([0-2])-type-([0-2])-area_id-(\d+)-curpage-(\d+)\.html$/',
'/^brand-index\.html$/',
'/^show_groupbuy-index-area_id-(\d+)-groupbuy_class-(\d+)-groupbuy_price-(\d+)-groupbuy_order_key-(\d+)-groupbuy_order-(\d+)-curpage-(\d+)\.html$/',
'/^show_groupbuy-groupbuy_soon-area_id-(\d+)-groupbuy_class-(\d+)-groupbuy_price-(\d+)-groupbuy_order_key-(\d+)-groupbuy_order-(\d+)-curpage-(\d+)\.html$/',
'/^show_groupbuy-groupbuy_history-area_id-(\d+)-groupbuy_class-(\d+)-groupbuy_price-(\d+)-groupbuy_order_key-(\d+)-groupbuy_order-(\d+)-curpage-(\d+)\.html$/',
'/^show_groupbuy-groupbuy_detail-group_id-(\d+).html$/',
'/^pointprod-index.html$/',
'/^pointprod-plist.html$/',
'/^pointprod-pinfo-id-(\d+).html$/',
'/^pointvoucher-index.html$/',
'/^goods-comments_list-goods_id-(\d+)-type-([0-3])-curpage-(\d+).html$/'
);
$reg_match_to = array(
'item-\\1-\\2.html',
'shop-\\1.html',
'shop_view-\\1-\\2-\\3-\\4-\\5.html',
'article-\\1.html',
'article_cate-\\1.html',
'document-\\1.html',
'cate-\\1-\\2-\\3-\\4-\\5-\\6-\\7-\\8.html',
'brand-\\1-\\2-\\3-\\4-\\5-\\6.html',
'brand.html',
'groupbuy-\\1-\\2-\\3-\\4-\\5-\\6.html',
'groupbuy_soon-\\1-\\2-\\3-\\4-\\5-\\6.html',
'groupbuy_history-\\1-\\2-\\3-\\4-\\5-\\6.html',
'groupbuy_detail-\\1.html',
'integral.html',
'integral_list.html',
'integral_item-\\1.html',
'voucher.html',
'comments-\\1-\\2-\\3.html'
);
$url_string = preg_replace($reg_match_from,$reg_match_to,$url_string);
return rtrim($site_url,'/').'/'.$url_string;
}

Второй

class Route {

/**
* PATH_INFO 分隔符
*
* @var string
*/
private $_pathinfo_split = '-';

/**
* 系统配置信息
*
* @var array
*/

private $_config = array();

/**
* PATH_INFO内容分隔正则
*
* @var string
*/
private $_pathinfo_pattern = '';

/**
* 伪静态文件扩展名
*
* @var string
*/
private $_rewrite_extname = '.html';

/**
* 构造方法
*
*/
public function __construct($config = array()) {
$this->_config = $config;
$this->_pathinfo_pattern = "/{$this->_pathinfo_split}/";
$this->parseRule();
}

/**
* 路由解析
*
*/
public function parseRule() {
if ($this->_config['url_model']) {
$this->_parseRuleRewrite();
} else {
$this->_parseRuleNormal();
}
}

/**
* 默认URL模式
*
*/
private function _parseRuleNormal() {
//不进行任何处理
}

/**
* 伪静态模式
*
*/
private function _parseRuleRewrite() {
$path_info = !empty($_SERVER['PATH_INFO']) ? $_SERVER['PATH_INFO'] : $_SERVER['REDIRECT_REDIRECT_PATH_INFO'];
$path_info = trim($path_info,'/');

//如果为二级目录去掉目录信息
if(strpos($path_info, '/')) {
$path_info_array = explode('/', $path_info);
$path_info = end($path_info_array);
}

if (!empty($path_info) && $path_info != 'index.php' && strpos($path_info, $this->_rewrite_extname)){
//去掉伪静态扩展名
$path_info = substr($path_info,0,-strlen($this->_rewrite_extname));

//根据不同APP匹配url规则
$path_info_function = '_' . APP_ID . 'PathInfo';
$path_info = $this->$path_info_function($path_info);

$split_array = preg_split($this->_pathinfo_pattern,$path_info);
//act,op强制赋值
$_GET['act'] = isset($split_array[0]) ? $split_array[0] : 'index';
$_GET['op'] = isset($split_array[1]) ? $split_array[1] : 'index';
unset($split_array[0]);
unset($split_array[1]);

//其它参数也放入$_GET
while (current($split_array) !== false) {
$name = current($split_array);
$value = next($split_array);
$_GET[$name] = $value;
if (next($split_array) === false){
break;
}
}
} else {
$_GET['act'] = $_GET['op'] = 'index';
}
}

/**
* 商城短网址还原成长网址
* @param unknown $path_info
* @return mixed
*/
private function _shopPathInfo($path_info) {
$reg_match_from = array(
'/^item-([a-z0-9-]+)-([0-9]*)$/',
'/^shop-(\d+)$/',
'/^shop_view-(\d+)-(\d+)-([0-5])-([0-2])-(\d+)$/',
'/^article-(\d+)$/',
'/^article_cate-(\d+)$/',
'/^document-([a-z_]+)$/',
'/^cate-(\d+)-([0-9_]+)-([0-9_]+)-([0-3])-([0-2])-([0-2])-(\d+)-(\d+)$/',
'/^brand-(\d+)-([0-3])-([0-2])-([0-2])-(\d+)-(\d+)$/',
'/^brand$/',
'/^groupbuy-(\d+)-(\d+)-(\d+)-(\d+)-(\d+)-(\d+)$/',
'/^groupbuy_soon-(\d+)-(\d+)-(\d+)-(\d+)-(\d+)-(\d+)$/',
'/^groupbuy_history-(\d+)-(\d+)-(\d+)-(\d+)-(\d+)-(\d+)$/',
'/^groupbuy_detail-(\d+)$/',
'/^integral$/',
'/^integral_list$/',
'/^integral_item-(\d+)$/',
'/^voucher$/',
'/^comments-(\d+)-([0-3])-(\d+)$/'
);
$reg_match_to = array(
'goods-index-goods_translit-\\1-goods_id-\\2',
'show_store-index-store_id-\\1',
'show_store-goods_all-store_id-\\1-stc_id-\\2-key-\\3-order-\\4-curpage-\\5',
'article-show-article_id-\\1',
'article-article-ac_id-\\1',
'document-index-code-\\1',
'search-index-cate_id-\\1-b_id-\\2-a_id-\\3-key-\\4-order-\\5-type-\\6-area_id-\\7-curpage-\\8',
'brand-list-brand-\\1-key-\\2-order-\\3-type-\\4-area_id-\\5-curpage-\\6',
'brand-index',
'show_groupbuy-index-area_id-\\1-groupbuy_class-\\2-groupbuy_price-\\3-groupbuy_order_key-\\4-groupbuy_order-\\5-curpage-\\6',
'show_groupbuy-groupbuy_soon-area_id-\\1-groupbuy_class-\\2-groupbuy_price-\\3-groupbuy_order_key-\\4-groupbuy_order-\\5-curpage-\\6',
'show_groupbuy-groupbuy_history-area_id-\\1-groupbuy_class-\\2-groupbuy_price-\\3-groupbuy_order_key-\\4-groupbuy_order-\\5-curpage-\\6',
'show_groupbuy-groupbuy_detail-group_id-\\1',
'pointprod-index',
'pointprod-plist',
'pointprod-pinfo-id-\\1',
'pointvoucher-index',
'goods-comments_list-goods_id-\\1-type-\\2-curpage-\\3'
);
return preg_replace($reg_match_from,$reg_match_to,$path_info);
}

/**
* CMS短网址还原成长网址
* @param unknown $path_info
* @return mixed
*/
private function _cmsPathInfo($path_info) {
$reg_match_from = array(
'/^article-(\d+)$/',
'/^picture-(\d+)$/'
);
$reg_match_to = array(
'article-article_detail-article_id-\\1',
'picture-picture_detail-picture_id-\\1'
);
return preg_replace($reg_match_from,$reg_match_to,$path_info);
}

}

И файл .htaccess такого вида

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
</IfModule>
https://mallinru.ru/ (https://mallinru.ru/)
L1
На сайте с 21.09.2007
Offline
114
#1

'item-\\1-\\2.html',

Проблема скорее не в цифрах а в -, попробуйте в транслите заменять пробелы на _ а не на -.

Или регулярки переделайте.

J2
На сайте с 13.12.2011
Offline
46
#2

К сожалению так не работает. Точнее ссылка работает но она такого вида http://test1.ru/shop/goods-index-goods_translit-ob_yavlenie_budet_vydeleno_krasnym_cvetom_i_budet_otobrazheno_srazu_posle_nazvaniya_tovara_ob_yavlenie_ne_mozhet_byt_dlinnee_chem_100_simvolov-goods_id-100000.html

---------- Добавлено 28.05.2014 в 18:42 ----------

L3n1n:

Или регулярки переделайте.

Как это сделать подскажите пожалуйста?

siv1987
На сайте с 02.04.2009
Offline
427
#3
Jigan2:
Проблема вот в чем когда в транслите нет цифр то все отлично работает, а с цифрами нет.


$reg_match_to = array(
'item-\\1-\\2.html',


$reg_match_from = array(
'/^item-([a-z0-9-]+)-([0-9]*)$/',

Кажется явно не хватает .html

J2
На сайте с 13.12.2011
Offline
46
#4

Регулярки это наверное вот это?

function getNchash(){
if (C('captcha_status_login')){
return substr(md5(SHOP_SITE_URL.$_GET['act'].$_GET['op']),0,8);
} else {
return '';
}
}

/**
* 加密函数
*
* @param string $txt 需要加密的字符串
* @param string $key 密钥
* @return string 返回加密结果
*/
function encrypt($txt, $key = ''){
if (empty($txt)) return $txt;
if (empty($key)) $key = md5(MD5_KEY);
$chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_.";
$ikey ="-x6g6ZWm2G9g_vr0Bo.pOq3kRIxsZ6rm";
$nh1 = rand(0,64);
$nh2 = rand(0,64);
$nh3 = rand(0,64);
$ch1 = $chars{$nh1};
$ch2 = $chars{$nh2};
$ch3 = $chars{$nh3};
$nhnum = $nh1 + $nh2 + $nh3;
$knum = 0;$i = 0;
while(isset($key{$i})) $knum +=ord($key{$i++});
$mdKey = substr(md5(md5(md5($key.$ch1).$ch2.$ikey).$ch3),$nhnum%8,$knum%8 + 16);
$txt = base64_encode(time().'_'.$txt);
$txt = str_replace(array('+','/','='),array('-','_','.'),$txt);
$tmp = '';
$j=0;$k = 0;
$tlen = strlen($txt);
$klen = strlen($mdKey);
for ($i=0; $i<$tlen; $i++) {
$k = $k == $klen ? 0 : $k;
$j = ($nhnum+strpos($chars,$txt{$i})+ord($mdKey{$k++}))%64;
$tmp .= $chars{$j};
}
$tmplen = strlen($tmp);
$tmp = substr_replace($tmp,$ch3,$nh2 % ++$tmplen,0);
$tmp = substr_replace($tmp,$ch2,$nh1 % ++$tmplen,0);
$tmp = substr_replace($tmp,$ch1,$knum % ++$tmplen,0);
return $tmp;
}

/**
* 解密函数
*
* @param string $txt 需要解密的字符串
* @param string $key 密匙
* @return string 字符串类型的返回结果
*/
function decrypt($txt, $key = '', $ttl = 0){
if (empty($txt)) return $txt;
if (empty($key)) $key = md5(MD5_KEY);

$chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_.";
$ikey ="-x6g6ZWm2G9g_vr0Bo.pOq3kRIxsZ6rm";
$knum = 0;$i = 0;
$tlen = @strlen($txt);
while(isset($key{$i})) $knum +=ord($key{$i++});
$ch1 = @$txt{$knum % $tlen};
$nh1 = strpos($chars,$ch1);
$txt = @substr_replace($txt,'',$knum % $tlen--,1);
$ch2 = @$txt{$nh1 % $tlen};
$nh2 = @strpos($chars,$ch2);
$txt = @substr_replace($txt,'',$nh1 % $tlen--,1);
$ch3 = @$txt{$nh2 % $tlen};
$nh3 = @strpos($chars,$ch3);
$txt = @substr_replace($txt,'',$nh2 % $tlen--,1);
$nhnum = $nh1 + $nh2 + $nh3;
$mdKey = substr(md5(md5(md5($key.$ch1).$ch2.$ikey).$ch3),$nhnum % 8,$knum % 8 + 16);
$tmp = '';
$j=0; $k = 0;
$tlen = @strlen($txt);
$klen = @strlen($mdKey);
for ($i=0; $i<$tlen; $i++) {
$k = $k == $klen ? 0 : $k;
$j = strpos($chars,$txt{$i})-$nhnum - ord($mdKey{$k++});
while ($j<0) $j+=64;
$tmp .= $chars{$j};
}
$tmp = str_replace(array('-','_','.'),array('+','/','='),$tmp);
$tmp = trim(base64_decode($tmp));

if (preg_match("/\d{10}_/s",substr($tmp,0,11))){
if ($ttl > 0 && (time() - substr($tmp,0,11) > $ttl)){
$tmp = null;
}else{
$tmp = substr($tmp,11);
}
}
return $tmp;
}

/**
* 取得IP
*
*
* @return string 字符串类型的返回结果
*/
function getIp(){
if (@$_SERVER['HTTP_CLIENT_IP'] && $_SERVER['HTTP_CLIENT_IP']!='unknown') {
$ip = $_SERVER['HTTP_CLIENT_IP'];
} elseif (@$_SERVER['HTTP_X_FORWARDED_FOR'] && $_SERVER['HTTP_X_FORWARDED_FOR']!='unknown') {
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
$ip = $_SERVER['REMOTE_ADDR'];
}
return preg_match('/^\d[\d.]+\d$/', $ip) ? $ip : '';
}


---------- Добавлено 28.05.2014 в 19:45 ----------

Кажется явно не хватает .html


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

---------- Добавлено 28.05.2014 в 19:59 ----------

Всем спасибо добрые люди я сам разобрался. Там оказывается ссылка в базу записывалась а я формат не изменил.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий