0, 'SYS_ADMIN_CODE' => 0, 'SYS_ADMIN_LOG' => 0, 'SYS_AUTO_FORM' => 0, 'SYS_ADMIN_PAGESIZE' => 10, 'SYS_CRON_AUTH' => '', 'SYS_TABLE_ISFOOTER' => 0, 'SYS_SMS_IMG_CODE' => 0, 'SYS_GO_404' => 0, 'SYS_THEME_ROOT_PATH' => 0, 'SYS_301' => 0, 'SYS_NOT_UPDATE' => 0, 'SYS_URL_ONLY' => 0, 'SYS_URL_REL' => 0, 'SYS_KEY' => 'xunruicms', 'SYS_API_TOKEN' => '', 'SYS_CSRF' => 1, 'SYS_CSRF_TIME' => 0, 'SYS_API_REL' => 0, 'SYS_HTTPS' => 0, 'SYS_NOT_ADMIN_CACHE' => 1, 'SYS_ADMIN_MODE' => 0, 'SYS_ADMIN_LOGINS' => 0, 'SYS_ADMIN_LOGIN_AES' => 0, 'SYS_ATTACHMENT_DOWN_REMOTE' => 0, 'SYS_ATTACHMENT_DOWN_SIZE' => 50, 'SYS_ADMIN_LOGIN_TIME' => 0, 'SYS_LOGIN_AES' => 0, 'SYS_ADMIN_OAUTH' => 0, 'SYS_ADMIN_SMS_LOGIN' => 0, 'SYS_ADMIN_SMS_CHECK' => 0, 'SYS_ATTACHMENT_DB' => 1, 'SYS_ATTACHMENT_PAGESIZE' => 36, 'SYS_ATTACHMENT_GUEST' => 0, 'SYS_ATTACHMENT_CF' => 0, 'SYS_ATTACHMENT_REL' => 0, 'SYS_ATTACHMENT_PATH' => '', 'SYS_ATTACHMENT_SAVE_TYPE' => '', 'SYS_ATTACHMENT_SAVE_DIR' => '', 'SYS_ATTACHMENT_SAVE_ID' => '', 'SYS_ATTACHMENT_URL' => '', 'SYS_AVATAR_PATH' => '', 'SYS_AVATAR_URL' => '', 'SYS_API_CODE' => '', 'SYS_ATTACHMENT_SAFE' => '', ]; if (is_file(WRITEPATH.'config/system.php')) { $my = require WRITEPATH.'config/system.php'; } else { $my = []; } // 强制禁用301 if (defined('IS_NOT_301') && IS_NOT_301) { $my['SYS_301'] = 1; } foreach ($system as $var => $value) { if (!defined($var)) { define($var, isset($my[$var]) ? $my[$var] : $value); } } unset($my, $system); !defined('IS_ADMIN_CACHE') && define('IS_ADMIN_CACHE', '1'); // 已废弃 !defined('SQGS') && define('SQGS', '迅睿开源框架'); !defined('CI_DEBUG') && define('CI_DEBUG', IS_DEV ? true : IS_ADMIN && SYS_DEBUG); !defined('IS_FB_DEBUG') && define('IS_FB_DEBUG', CI_DEBUG ? 0 : 1); // 显示错误提示 IS_ADMIN || IS_DEV ? error_reporting(E_ALL ^ E_NOTICE ^ E_WARNING ^ E_DEPRECATED) : error_reporting(0); // 显示错误提示 if (CI_DEBUG) { ini_set('display_errors', 1); // 重置Zend OPcache function_exists('opcache_reset') && opcache_reset(); define('ENVIRONMENT', 'development'); } else { ini_set('display_errors', 0); !defined('ENVIRONMENT') && define('ENVIRONMENT', 'production'); } // 缓存变量 $cache = []; if (is_file(WRITEPATH.'config/cache.php')) { $cache = require WRITEPATH.'config/cache.php'; IS_DEV && $cache['SYS_CACHE'] = 0; // 开发者模式下关闭缓存 } foreach ([ 'SYS_CACHE', 'SYS_CACHE_TYPE', 'SYS_CACHE_SHOW', 'SYS_CACHE_LIST', 'SYS_CACHE_SEARCH', 'SYS_CACHE_SMS', 'SYS_CACHE_CRON', 'SYS_CACHE_CLEAR', ] as $name) { define($name, isset($cache[$name]) ? floatval($cache[$name]) : 0); } unset($cache); // 自定义开发目录分布 if (IS_XRDEV) { require MYPATH.'Dev.php'; } else { // 判断是否是app目录 function dr_is_app_dir($name) { if (!$name) { return false; } elseif ($name == 'module') { $name = 'cms'; } return is_dir(APPSPATH.ucfirst($name)); } // 获取指定app目录 function dr_get_app_dir($name) { if (!$name) { return false; } elseif ($name == 'module') { $name = 'cms'; } return APPSPATH.ucfirst($name).'/'; } // 获取模板目录 function dr_get_app_tpl($name = '') { return TPLPATH; } // 获取app目录 function dr_get_app_list() { return APPSPATH; } // 获取app的css地址 function dr_get_app_css($name) { if ($name == 'module') { $name = 'cms'; } return (defined('THEME_PATH') ? THEME_PATH : '/static/').$name.'/'; } // 获取app的css目录 function dr_get_app_css_dir($name) { if ($name == 'module') { $name = 'cms'; } return WEBPATH.'static/'.$name.'/'; } } /* * 重写日志记录函数 */ function log_message($level, $message, array $context = []) { return \Phpcmf\Service::Log($level, $message, $context); } // 兼容错误提示 function dr_show_error($msg, $dev = '') { if (CI_DEBUG) { $log = 'ERROR - '.date('Y-m-d H:i:s'). ' --> '.$msg . '('.FC_NOW_URL.')'; $file = WRITEPATH . 'error/log-'.date('Y-m-d').'.php'; if (!is_file($file)) { file_put_contents($file, "".PHP_EOL.$log); } else { file_put_contents($file, $log.PHP_EOL, FILE_APPEND); } } if ($dev && !CI_DEBUG) { $msg = $dev; } if (!IS_ADMIN) { // 前端不显示错误详情 if (CI_DEBUG) { $url = '

'.FC_NOW_URL.'

'; } else { $url = '

在index.php中开启开发者模式可以看到故障详细情况

'; $msg = '您的系统遇到了故障,请联系管理员处理'; http_response_code(404); } } if (IS_AJAX) { $msg = json_encode([ 'code' => 0, 'msg' => $msg ],JSON_UNESCAPED_UNICODE); if (isset($_GET['callback']) && $_GET['callback']) { echo $_GET['callback'].'('.$msg.')';exit; } else { echo $msg;exit; } } else { exit("系统错误

{$msg}

{$url}
"); } } /** * 全局返回消息 */ function dr_exit_msg($code, $msg, $data = [], $token = []) { if (!CI_DEBUG) { ob_end_clean(); } $rt = [ 'code' => $code, 'msg' => $msg, 'data' => $data, 'token' => $token, ]; if (isset($_GET['callback'])) { // jsonp header('HTTP/1.1 200 OK'); log_message('error', $msg . '('.FC_NOW_URL.')'); echo ($_GET['callback'] ? $_GET['callback'] : 'callback').'('.json_encode($rt, JSON_UNESCAPED_UNICODE).')'; } else if (($_GET['is_ajax'] || (defined('IS_API_HTTP') && IS_API_HTTP) || IS_AJAX)) { // json header('HTTP/1.1 200 OK'); log_message('error', $msg . '('.FC_NOW_URL.')'); echo json_encode($rt, JSON_UNESCAPED_UNICODE); } else { // html dr_show_error($msg); } exit; } /* * 伪静态中获取uri */ if (!function_exists('dr_get_rewrite_uri')) { function dr_get_rewrite_uri($uu) { // 以index.php或者?开头的uri不做处理 return strpos($uu, SELF) === 0 || strpos($uu, '?') === 0 ? '' : $uu; } } /* * 读取伪静态路由储存路径 */ function dr_rewrite_routes_path($uri) { $uri = trim($uri, '/'); $path = WRITEPATH . 'route/'.(defined('SITE_ID') ? SITE_ID : 1).'/'; // 路由缓存根目录 $hash = md5($uri); // 用MD5做均匀散列(核心:解决目录拥挤) $dir1 = substr($hash, 0, 2); // 一级目录 $dir2 = substr($hash, 2, 2); // 二级目录 $save = $path . '/' . $dir1 . '/' . $dir2; // 最终目录 return [$save, $hash]; } /* * 读取伪静态路由文件 */ function dr_get_rewrite_routes($uri) { if (!$uri) { return ''; } if (SYS_301 || !SYS_URL_ONLY) { // 自由参数或模糊匹配 list($uri, $query) = explode('?', $uri); } $uri = urldecode($uri); // uri中存在分页参数,则替换为{page} if (preg_match_all('/\d+/', $uri, $m, PREG_OFFSET_CAPTURE)) { // 倒序数组 $nums = array_reverse($m[0]); foreach ($nums as $p) { list($save, $hash) = dr_rewrite_routes_path(str_replace($p[0], '{page}', $uri)); $file = $save . '/' . $hash . '.txt'; if (is_file($file)) { return str_replace('{page}', $p[0], (string)file_get_contents($file)); } } } list($save, $hash) = dr_rewrite_routes_path($uri); if (!is_dir($save)) { mkdir($save, 0755, true); } $file = $save . '/' . $hash . '.txt'; if (is_file($file)) { return file_get_contents($file); } return ''; } /* * 储存伪静态路由文件 */ function dr_save_rewrite_routes($uri, $routes) { if (!$uri || !$routes) { return ''; } $uri = trim($uri, '/'); $uri = urldecode($uri); $routes = urldecode($routes); $uri = str_replace(['[page]', '%7Bpage%7D', '%5Bpage%5D', '%7bpage%7d', '%5bpage%5d'], '{page}', $uri); $routes = str_replace(['[page]', '%7Bpage%7D', '%5Bpage%5D', '%7bpage%7d', '%5bpage%5d'], '{page}', $routes); list($save, $hash) = dr_rewrite_routes_path($uri); if (!is_dir($save)) { mkdir($save, 0755, true); } file_put_contents($save . '/' . $hash . '.txt', $routes); } /* * 删除伪静态路由文件 */ function dr_del_rewrite_routes($uri) { $uri = trim($uri, '/'); list($save, $hash) = dr_rewrite_routes_path($uri); $file = $save . '/' . $hash . '.txt'; if (is_file($file)) { @unlink($file); } return true; } /* * 函数是否被启用 */ if (!function_exists('locale_set_default')) { function locale_set_default($a) { } } /* * url后缀参数格式化 */ function dr_url_safe_params($url) { if (!$url) { return $url; } // 移除所有非URL合法字符 $url = preg_replace('/[^a-zA-Z0-9\%:\/?#\[\]@!$&\'()*+,;=._~-]/', '', $url); // 移除JavaScript事件处理器 $url = preg_replace('/on\w+\s*=/i', '', $url); // 移除HTML标签 $url = strip_tags($url); return $url; } /* * 重写is_cli */ function is_cli(): bool { if (stripos(PHP_SAPI, 'cli') !== false || defined('STDIN')) { return true; } return false; } // 是否使用建站系统 define('IS_USE_CMS', is_file(dr_get_app_dir('cms').'/install.lock') ? dr_get_app_dir('cms') : ''); define('IS_USE_MODULE', IS_USE_CMS); // 是否使用用户系统 define('IS_USE_MEMBER', is_file(dr_get_app_dir('member').'/install.lock') ? dr_get_app_dir('member') : ''); if (is_cli()) { // CLI命令行模式 define('ADMIN_URL', 'http://localhost/'); define('FC_NOW_URL', 'http://localhost/'); define('FC_NOW_HOST', 'http://localhost/'); define('DOMAIN_NAME', 'http://localhost/'); define('WEB_DIR', '/'); if ($_SERVER["argv"]) { foreach ($_SERVER["argv"] as $val) { if (strpos($val, '=') !== false) { list($name) = explode('=', $val); $_GET[$name] = substr($val, strlen($name)+1); } } } } else { // 正常访问模式 // 当前URL $url = 'http'; if ((!IS_ADMIN && isset($system['SYS_HTTPS']) && $system['SYS_HTTPS']) || (defined('IS_HTTPS_FIX') && IS_HTTPS_FIX) || (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') || (isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] == '443') || (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') || (isset($_SERVER['HTTP_FROM_HTTPS']) && $_SERVER['HTTP_FROM_HTTPS'] == 'on') || (!empty($_SERVER['HTTP_FRONT_END_HTTPS']) && strtolower($_SERVER['HTTP_FRONT_END_HTTPS']) != 'off') ) { $url.= 's'; } $host = strtolower($_SERVER['HTTP_HOST']); if (defined('IS_PORT_FIX') && IS_PORT_FIX && strpos($host, ':') === false) { // 端口修复 $host.= ':'.IS_PORT_FIX; } elseif (strpos($host, ':') !== false) { list($nhost, $port) = explode(':', $host); if ($port == 80) { $host = $nhost; // 排除80端口 } } $url.= '://'.$host; IS_ADMIN && define('ADMIN_URL', $url.'/'); // 优先定义后台域名 // url后缀参数 $end = ($_SERVER['REQUEST_URI'] ? $_SERVER['REQUEST_URI'] : (isset($_SERVER['QUERY_STRING']) && $_SERVER['QUERY_STRING'] ? $_SERVER['PHP_SELF'].'?'.$_SERVER['QUERY_STRING'] : $_SERVER['PHP_SELF'])); define('FC_NOW_URL', $url.dr_url_safe_params($end)); define('FC_NOW_HOST', $url.'/'); // 域名部分 define('DOMAIN_NAME', $host); // 当前域名 // 伪静态字符串 $uu = isset($_SERVER['HTTP_X_REWRITE_URL']) || trim($_SERVER['REQUEST_URI'], '/') == SELF ? trim($_SERVER['HTTP_X_REWRITE_URL'], '/') : ($_SERVER['REQUEST_URI'] ? trim($_SERVER['REQUEST_URI'], '/') : NULL); if (defined('FIX_WEB_DIR') && FIX_WEB_DIR && strpos($uu, FIX_WEB_DIR) !== false && strpos($uu, FIX_WEB_DIR) === 0) { $uu = trim(substr($uu, strlen(FIX_WEB_DIR)), '/'); define('WEB_DIR', '/'.trim(FIX_WEB_DIR, '/').'/'); } else { define('WEB_DIR', '/'); } // 当前URI $uri = dr_get_rewrite_uri($uu); define('CMSURI', $uri); // 根据自定义URL规则来识别路由 if (!IS_ADMIN && CMSURI && !defined('IS_API') && !defined('FIX_WEB_URL')) { // 读取伪静态路由文件 $rcache = dr_get_rewrite_routes(CMSURI); if ($rcache) { $routes = [ CMSURI => $rcache, ]; } else { // 自定义URL解析规则 $routes = []; $routes['index\.html(.*)'] = 'index.php?c=home&m=index'; $routes['404\.html(.*)'] = 'index.php?&c=home&m=s404&uri='.CMSURI; $routes['cms-license(.*)'] = 'index.php?s=api&c=rewrite&m=license'; $routes['rewrite-test.html(.*)'] = 'index.php?s=api&c=rewrite&m=test'; if (is_file(WEBPATH.'config/rewrite.php')) { $my = require WEBPATH.'config/rewrite.php'; if ($my && is_array($my)) { $routes = array_merge($routes, $my); } } elseif (is_file(CONFIGPATH.'rewrite.php')) { $my = require CONFIGPATH.'rewrite.php'; if ($my && is_array($my)) { $routes = array_merge($routes, $my); } } } // 正则匹配路由规则 $is_404 = 1; foreach ($routes as $key => $val) { $rewrite = $match = []; //(defined('SYS_URL_PREG') && SYS_URL_PREG ? '' : '$') if ($key == CMSURI || preg_match('/^'.$key.'$/U', CMSURI, $match)) { unset($match[0]); // 开始匹配 $is_404 = 0; // 开始解析路由 URL参数模式 $_GET = []; $queryParts = explode('&', str_replace(['index.php?', '/index.php?'], '', $val)); if ($queryParts) { foreach ($queryParts as $param) { $item = explode('=', $param); $_GET[$item[0]] = $item[1]; if (strpos($item[1], '$') !== FALSE) { $id = (int)substr($item[1], 1); $_GET[$item[0]] = isset($match[$id]) ? $match[$id] : $item[1]; } } } !$_GET['c'] && $_GET['c'] = 'home'; !$_GET['m'] && $_GET['m'] = 'index'; // 结束匹配 break; } } // 说明是404 if ($is_404) { $_GET['s'] = ''; $_GET['c'] = 'home'; $_GET['m'] = 's404'; $_GET['uri'] = CMSURI; } } // 自定义路由模式 if (is_file(WEBPATH.'config/router.php')) { require WEBPATH.'config/router.php'; } elseif (is_file(CONFIGPATH.'router.php')) { require CONFIGPATH.'router.php'; } } !defined('CMSURI') && define('CMSURI', ''); // API接口项目标识 放到后面是为了识别api 的伪静态 !defined('IS_API') && define('IS_API', isset($_GET['s']) && $_GET['s'] == 'api'); // 解析自定义域名 if (!IS_API && $_GET['s'] != 'api' && is_file(WRITEPATH.'config/domain_app.php')){ $domain = require WRITEPATH.'config/domain_app.php'; // 强制定义为模块 if (isset($domain[DOMAIN_NAME]) && $domain[DOMAIN_NAME] && is_dir(APPSPATH.ucfirst($domain[DOMAIN_NAME]))) { $_GET['s'] = $domain[DOMAIN_NAME]; } unset($domain); } // 自定义入口执行 if (function_exists('cms_init')) { cms_init(); } // 判断自定义首页入口 if (defined('CMSURI') && !CMSURI && !IS_ADMIN && !IS_API && !isset($_GET['s']) && is_file(WRITEPATH.'index.lock') ) { $index = file_get_contents(WRITEPATH.'index.lock'); if ($index) { list($a, $b, $c) = explode('/', trim($index)); if ($a && dr_is_app_dir($a) && $b && $c) { $_GET['s'] = $a; $_GET['c'] = trim($b); $_GET['m'] = trim($c); } } } if (IS_USE_CMS && isset($_GET['s']) && $_GET['s'] == 'module') { $_GET['s'] = 'cms'; } // 判断s参数,“应用程序”文件夹目录 if (!IS_API && isset($_GET['s']) && preg_match('/^[a-z_]+$/i', $_GET['s'])) { // 判断会员模块,排除后台调用 $dir = ucfirst($_GET['s']); if (!IS_ADMIN && $dir == 'Member') { // 用户系统 if (!IS_USE_MEMBER) { dr_show_error('用户系统插件未安装', '无权限使用用户系统'); } if ($_GET['app'] && dr_is_app_dir($_GET['app'])) { // 模块应用 define('APPPATH', dr_get_app_dir($_GET['app'])); define('APP_DIR', strtolower($_GET['app'])); // 应用目录名称 } else { // 表示会员模块 define('APPPATH', IS_USE_MEMBER); define('APP_DIR', 'member'); // 模块目录名称 } define('IS_MEMBER', TRUE); } elseif (dr_is_app_dir($dir)) { // 模块应用 define('APPPATH', dr_get_app_dir($dir)); define('APP_DIR', strtolower($dir)); // 应用目录名称 define('IS_MEMBER', FALSE); } else { // 不存在的应用 dr_show_error('应用程序('.dr_get_app_dir($dir).')不存在', '应用程序('.strtolower($dir).')不存在'); } } else { // 系统主目录 !defined('APPPATH') && define('APPPATH', FRAMEPATH); !defined('APP_DIR') && define('APP_DIR', ''); define('IS_MEMBER', FALSE); } // 是否前端 define('IS_HOME', !IS_ADMIN && !IS_MEMBER); // 系统函数库 require CMSPATH.'Core/Helper.php'; // 进入系统框架加载 require FRAMEPATH.'Init.php';