HEX
Server: nginx/1.28.1
System: Linux 10-41-63-61 6.8.0-31-generic #31-Ubuntu SMP PREEMPT_DYNAMIC Sat Apr 20 00:40:06 UTC 2024 x86_64
User: www (1001)
PHP: 7.4.33
Disabled: passthru,exec,system,putenv,chroot,chgrp,chown,shell_exec,popen,proc_open,pcntl_exec,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,imap_open,apache_setenv
Upload Files
File: /www/wwwroot/bs.kntsleep.com/system/basic/class/rewrite.class.php
<?php
/*
 * Copyright (c) Huyin Information Technology Co., Ltd. All Rights Reserved.
 * BOSSCMS Content Management System (https://www.bosscms.net/)
 */
defined('IS_OK') or exit('Access Forbidden');

class rewrite
{
	public static function rule()
	{
		global $G;
		$G['config'] = arrOption(mysql::select_all('name,value','config',"name LIKE 'rule%' AND parent='0' AND type='0' AND lang='0'"));
		$G['language'] = mysql::select_one('*','language',"defaults='1'");
		$rule = false;
		$ruleall = self::json();
		if($G['path']['quest']){
			parse_str($G['path']['quest'],$get);
			$G['get'] = strFilter($get);
		}
		foreach($ruleall as $k=>$v){
			$G['rp'] = array();
			$reg = preg_replace_callback(
				'/\[\w+\]/',
				function($match){
					if($match[0]){
						$m = preg_replace('/^\[|\]$/','',$match[0]);
						global $G;
						static $i;
						$i++;
						$G['rp'][$m] = $i;
						if($m=='folder'){
							if(isset($G['rule_all']['folder'])){
								return $G['rule_all']['folder'];
							}else{
								$res = mysql::select_all('folder','items',"type!=9 AND display=1 AND lang=lang");
								$folder = array();
								foreach($res as $v){
									$folder[] = preg_quote($v['folder']);
								}
								if($folder){
									usort($folder,function($a,$b){
										if(strlen($a)==strlen($b)) return 0;
										return strlen($a)>strlen($b)?-1:1;
									});
									return $G['rule_all']['folder']='('.implode('|',$folder).')';
								}else{
									return $G['rule_all']['folder']='';
								}
							}
						}else if(preg_match('/^(static|tag)$/',$m)){
							return '([a-zA-Z0-9_^\x00-\xff]+?)';
						}else if(preg_match('/^(lang|action|area|type)$/',$m)){
							return '([a-zA-Z0-9]+?)';
						}else if(preg_match('/^(items|id|pages)$/',$m)){
							return '([0-9]+?)';
						}else{
							return '(.+?)';
						}
					}
				},
				regFilter($v,'[]')
			);
			preg_match('/^'.$reg.'$/',$G['path']['resource'],$match);
			if($match[0]){
				$m = strFilter($match);
				if(preg_match('/^area/',$k)){
					$zq = $m[$G['rp']['area']];
					if(mysql::total('area',"sign='{$zq}'")){
						$G['get']['zq'] = $zq;
						$k = preg_replace('/^area/','',$k);
						if($k==24) $k=2;
						if($k==11) $k=1;
					}
				}
				$r = 'rule'.substr($k,0,1);
				if(method_exists('rewrite', $r)){
					if($rule = call_user_func(array('rewrite',$r), $m, $G['rp'])){
						break;
					}
				}
			}
		}
		unset($G['rule_all']);
		unset($G['rp']);
		if(mysql::total('config',"name='rewrite_open' AND value='1' AND parent='0' AND type='0' AND lang='{$G['get']['lang']}'")){
			return $rule;
		}
	}
	
	public static function json()
	{
		global $G;
		if(is_file(ROOT_PATH.'cache/rule.json')){
			$ruleall = json::get(ROOT_PATH.'cache/rule.json');
		}else{
			$ruleall = array();
			if($G['config']['rule']){
				$rules = json::decode($G['config']['rule']);
			}else{
				into::basic_json('rule');
				$rules = json::decode($G['rule']);
			}
			foreach($rules as $k=>$v){
				if($k==2){
					if(strstr($v,'[folder]')){
						$ruleall[$k.'3'] = preg_replace('/[^\/]+$/','',$v). preg_replace('/^[^\w\[]+/','',$G['config']['rule_pages']). $G['config']['rule_extension'];
					}else{
						$ruleall[$k.'3'] = $v. $G['config']['rule_pages']. $G['config']['rule_extension'];
					}
				}
				if(preg_match('/^(2|4|6|7)$/',$k)){
					$ruleall[$k.'2'] = $v.$G['config']['rule_lang'].$G['config']['rule_pages'].$G['config']['rule_extension'];
					$ruleall[$k.'1'] = $v.$G['config']['rule_pages'].$G['config']['rule_extension'];
				}
				$ruleall[$k.'0'] = $v.$G['config']['rule_lang'].$G['config']['rule_extension'];
				$ruleall[$k] = $v.($k==6?'':$G['config']['rule_extension']);
			}
			if(mysql::total('config',"name='area_open' AND value='1' AND parent='0' AND type='0' AND lang=lang") && mysql::total('config',"name='area_link_type' AND value='0' AND parent='0' AND type='0' AND lang=lang")){
				$config = arrOption(mysql::select_all('name,value','config',"name LIKE 'area_rule%' AND parent='0' AND type='0' AND lang='0'"));
				$rall = array();
				foreach($ruleall as $k=>$v){
					if($k==10){
						$rall['area'.'11'] = $config['area_rule_home'].'/';
					}
					if($k==23){
						$rall['area'.'24'] = $config['area_rule_folder'].'/';
					}
					if(preg_match('/^(1|10)$/',$k)){
						$rall['area'.$k] = $config['area_rule_home'].'/'.$v;
					}else if(strstr($config['area_rule_folder'],'[folder]')){
						$rall['area'.$k] = str_replace('[folder]',$config['area_rule_folder'],$v);
					}else{
						$rall['area'.$k] = $config['area_rule_folder'].$v;
					}
				}
				$ruleall = $rall+$ruleall;
			}
			json::put(ROOT_PATH.'cache/rule.json',$ruleall);
		}
		return $ruleall;
	}
	
	
	public static function rule1($m, $rp)
	{
		global $G;
		$lang = $m[$rp['lang']];
		if($lang = self::lang($lang)){
			$G['get']['lang'] = $lang;
			$G['path']['home'] = true;
			$G['path']['folder'] = '';
			return true;
		}
	}	
	public static function rule2($m, $rp)
	{
		global $G;
		$folder = $m[$rp['folder']];
		$items = $m[$rp['items']];
		$lang = $m[$rp['lang']];
		$pages = $m[$rp['pages']];
		if($lang = self::lang($lang)){
			if(($folder && $res=mysql::select_one('id,type,folder','items',"folder='{$folder}' AND lang='{$lang}'"))|| 
			   ($items && $res=mysql::select_one('id,type,folder','items',"id='{$items}' AND lang='{$lang}'"))){
				$G['get']['pages'] = $pages;
				$G['get']['items'] = $items;
				$G['get']['lang'] = $lang;
				$G['path']['home'] = false;
				$G['path']['folder'] = $res['folder'];
				return true;
			}
		}
	}	
	public static function rule3($m, $rp)
	{
		global $G;
		$folder = $m[$rp['folder']];
		$items = $m[$rp['items']];
		$lang = $m[$rp['lang']];
		$pages = $m[$rp['pages']];
		if($lang = self::lang($lang)){
			if(($folder && mysql::total('items',"folder='{$folder}' AND id='{$items}' AND FIND_IN_SET(type,'1,6,7,8,10') AND lang='{$lang}'"))||
			   (!$folder && $items && mysql::total('items',"id='{$items}' AND FIND_IN_SET(type,'1,6,7,8,10') AND lang='{$lang}'"))){
				$G['get']['pages'] = $pages;
				$G['get']['items'] = $items;
				$G['get']['lang'] = $lang;
				$G['path']['home'] = false;
				$G['path']['folder'] = $folder;
				return true;
			}
		}
	}	
	public static function rule4($m, $rp)
	{
		global $G;
		$folder = $m[$rp['folder']];
		$items = $m[$rp['items']];
		$lang = $m[$rp['lang']];
		$pages = $m[$rp['pages']];
		if($lang = self::lang($lang)){
			if(($folder && mysql::total('items',"folder='{$folder}' AND id='{$items}' AND !FIND_IN_SET(type,'1,6,7,8,10') AND lang='{$lang}'"))||
			   (!$folder && $items && mysql::total('items',"id='{$items}' AND !FIND_IN_SET(type,'1,6,7,8,10') AND lang='{$lang}'"))){
				$G['get']['pages'] = $pages;
				$G['get']['items'] = $items;
				$G['get']['lang'] = $lang;
				$G['path']['home'] = false;
				$G['path']['folder'] = $folder;
				return true;
			}
		}
	}	
	public static function rule5($m, $rp)
	{
		global $G;
		$folder = $m[$rp['folder']];
		$type = $m[$rp['type']];
		$id = $m[$rp['id']];
		$lang = $m[$rp['lang']];
		if($lang = self::lang($lang)){
			if($folder && $res=mysql::select_one('type','items',"folder='{$folder}' AND (FIND_IN_SET(type,'2,3,4,5') OR (type>=20 AND type<=59)) AND lang='{$lang}'")){
				if($id && mysql::total(array_search($res['type'],$G['pass']['type']),"id='{$id}' AND lang='{$lang}'")){
					$G['get']['lang'] = $lang;
					$G['get']['id'] = $id;
					$G['path']['home'] = false;
					$G['path']['folder'] = $folder;
					return true;
				}
			}else if(preg_match('/^\w+$/',$type) && $id && $res=mysql::select_one('items',$type,"id='{$id}' AND lang='{$lang}'")){
				if($res2=mysql::select_one('folder','items',"id='{$res['items']}' AND (FIND_IN_SET(type,'2,3,4,5') OR (type>=20 AND type<=59)) AND lang='{$lang}'")){
					$G['get']['lang'] = $lang;
					$G['get']['id'] = $id;
					$G['path']['home'] = false;
					$G['path']['folder'] = $res2['folder'];
					return true;
				}
			}
		}
	}	
	public static function rule6($m, $rp)
	{
		global $G;
		$folder = $m[$rp['folder']];
		$tag = $m[$rp['tag']];
		$lang = $m[$rp['lang']];
		$pages = $m[$rp['pages']];
		if($lang = self::lang($lang)){
			if($folder && mysql::total('items',"folder='{$folder}' AND (FIND_IN_SET(type,'2,3,4,5') OR (type>=20 AND type<=59)) AND lang='{$lang}'")){
				$G['get']['pages'] = $pages;
				$G['get']['lang'] = $lang;
				$G['get']['tag'] = $tag;
				$G['path']['home'] = false;
				$G['path']['folder'] = $folder;
				return true;
			}
		}
	}	
	public static function rule7($m, $rp)
	{
		global $G;
		$folder = $m[$rp['folder']];
		$static = $m[$rp['static']];
		$lang = $m[$rp['lang']];
		$pages = $m[$rp['pages']];
		if($lang = self::lang($lang)){
			$static = urldecode($static);
			if($res=mysql::select_one('id','items',"folder='{$folder}' AND static='{$static}' AND lang='{$lang}'")){
				$G['get']['pages'] = $pages;
				$G['get']['lang'] = $lang;
				$G['get']['items'] = $res['id'];
				$G['path']['home'] = false;
				$G['path']['folder'] = $folder;
				return true;
			}else if(!$pages && $res=mysql::select_one('type','items',"folder='{$folder}' AND (FIND_IN_SET(type,'2,3,4,5') OR (type>=20 AND type<=59)) AND lang='{$lang}'")){
				if($r=mysql::select_one('id,items',array_search($res['type'],$G['pass']['type']),"static='{$static}' AND lang='{$lang}'")){
					$G['get']['lang'] = $lang;
					$G['get']['id'] = $r['id'];
					$G['get']['items'] = $r['items'];
					$G['path']['home'] = false;
					$G['path']['folder'] = $folder;
					return true;
				}
			}
		}
	}	
	public static function rule8($m, $rp)
	{
		global $G;
		$folder = $m[$rp['folder']];
		$action = $m[$rp['action']];
		$lang = $m[$rp['lang']];
		if($lang = self::lang($lang)){
			if($folder && mysql::total('items',"folder='{$folder}' AND type='11' AND lang='{$lang}'")){
				$G['get']['lang'] = $lang;
				$G['get']['action'] = $action;
				$G['path']['home'] = false;
				$G['path']['folder'] = $folder;
				return true;
			}
		}
	}
	
	public static function lang($lang)
	{
		global $G;
		if(!$lang || $G['language']['id']==$lang){
			return $G['language']['id'];
		}else{
			$res = mysql::select_one('id','language',(is_numeric($lang)?"id='{$lang}'":"sign='{$lang}'")."");
			return $res?$res['id']:false;
		}
	}
}
?>