class = strtolower(isset($_GET['c']) ? dr_safe_filename($_GET['c']) : 'home'); $this->method = strtolower(isset($_GET['m']) ? dr_safe_filename($_GET['m']) : 'index'); } // 获取用户中心,当前页面的URI public function member_uri() { $u = (APP_DIR && APP_DIR != 'member' ? APP_DIR . '/' : '') . $this->class . '/'; return [trim($u . $this->method, '/'), trim($u . 'index', '/')]; } // 获取当前页面的URI public function uri($m = '') { if (!$m && $this->_uri) { return $this->_uri; } $m = $m ? $m : $this->method; if (IS_MEMBER) { $_uri = 'member/' . trim((APP_DIR && APP_DIR != 'member' ? APP_DIR . '/' : '') . $this->class . '/' . $m, '/'); } else { $_uri = trim((APP_DIR ? APP_DIR . '/' : '') . $this->class . '/' . $m, '/'); } if ($m) { return $_uri; } $this->_uri = $_uri; return $this->_uri; } // 跳转到登录页面 public function go_member_login($url) { $url = $this->member_url('login/index', ['back' => urlencode($url)]); if (IS_DEV) { \Phpcmf\Service::C()->_admin_msg(1, '开发者模式:登录超时
正在自动跳转到登录页面(关闭开发者模式时即可自动跳转)', $url, 9); } else { dr_redirect($url); } exit; } // 获取返回时的URL public function get_back($uri, $param = [], $remove_total = false) { $name = md5((string)$_SERVER['HTTP_USER_AGENT'] . SELF . $uri . \Phpcmf\Service::C()->uid . SITE_ID . \Phpcmf\Service::L('input')->ip_address()); $value = \Phpcmf\Service::L('cache')->get_data($name); if ($value) { $uri = $value[0]; $param = dr_array22array($param, $value[1]); } // 移除统计参数 if ($remove_total && isset($param['total'])) { unset($param['total']); } return IS_ADMIN ? $this->url($uri, $param) : $this->member_url($uri, $param); } // 设置返回时的URL, uri页面标识,param参数,nuri当前页优先 public function set_back($uri, $param = [], $nuri = '') { $name = md5((string)$_SERVER['HTTP_USER_AGENT'] . SELF . $uri . \Phpcmf\Service::C()->uid . SITE_ID . \Phpcmf\Service::L('input')->ip_address()); $param['page'] = $_GET['page']; \Phpcmf\Service::L('cache')->set_data( $name, [$nuri ? $nuri : $uri, $param], 3600 ); } // 清理返回url public function clear_back($uri) { $name = md5((string)$_SERVER['HTTP_USER_AGENT'] . SELF . $uri . \Phpcmf\Service::C()->uid . SITE_ID . \Phpcmf\Service::L('input')->ip_address()); \Phpcmf\Service::L('cache')->del_data($name); } // 自动识别的跳转动作 public function auto_redirect($url) { if (isset($_GET['not301']) && intval($_GET['not301']) > 1) { return; // 排除自定义参数 } elseif (isset($_GET['page']) && intval($_GET['page']) > 1) { return; // 排除分页 } // 跳转 $this->redirect($url, true); } // 执行跳转动作 public function redirect($url, $auto = false) { // 跳转 if ($url != FC_NOW_URL) { if (!$auto) { if (IS_DEV) { if (defined('SYS_URL_ONLY') && SYS_URL_ONLY) { \Phpcmf\Service::C()->_admin_msg(0, '当前URL['.dr_now_url().']
与其本身地址['.$url.']不符
关闭开发者模式时本页面将成为404'); } \Phpcmf\Service::C()->_admin_msg(1, '开发者模式:
当前URL['.dr_now_url().']
与其本身地址['.$url.']不符
正在自动跳转本身地址(关闭开发者模式时即可自动跳转)', $url, 9); } elseif (defined('SYS_URL_ONLY') && SYS_URL_ONLY) { \Phpcmf\Service::C()->goto_404_page('匹配地址与实际地址不符'); } } elseif (IS_DEV) { // 自动识别 \Phpcmf\Service::C()->_admin_msg(1, '开发者模式:
当前URL['.dr_now_url().']
自动识别为['.$url.']
若不需要识别功能可在后台-设置-手机设置-关闭自动识别(如果开启了CDN请关闭自动识别)
正在自动跳转本身地址(关闭开发者模式时即可自动跳转)', $url, 9); } dr_redirect($url, 'location', '301'); } } // 判断满足定向跳转的条件 public function is_redirect_url($url, $is_mobile = 0, $is_page = 0) { // 不跳转的条件 if (!dr_is_sys_301()) { return; // 系统关闭301 } elseif (!$url || strpos($url, 'http') === FALSE) { return; // 为空时排除 } elseif (IS_API || IS_API_HTTP) { return; // 排除接口 } elseif (IS_ADMIN) { return; // 排除后台 } elseif (!$is_mobile && \Phpcmf\Service::IS_MOBILE()) { return; // 排除移动端,移动端不跳转开关 } elseif (defined('SC_HTML_FILE')) { return; // 排除生成 } elseif (isset($_GET['not301']) && intval($_GET['not301']) > 1) { return; // 排除自定义参数 } elseif (!$is_page && isset($_GET['page']) && intval($_GET['page']) > 1) { return; // 排除分页 } elseif (IS_CLIENT) { return; // 排除终端 } $this->redirect($url); } /** * url函数 * * @param string $url URL规则,如home/index * @param array $query 相关参数 * @return string 项目入口文件.php?参数 */ public function url($url, $query = [], $self = SELF) { if (!$url) { return $self; } if (!$query && strpos($url, ':') !== false) { list($a, $b) = explode(':', $url); $url = $a; $query = $this->url2array($b); } // 当是分站且没有绑定域名自动加上参数 #SITE_FID && !isset($query['fid']) && defined('SITE_BRANCH_DOMAIN') && !SITE_BRANCH_DOMAIN && $query['fid'] = SITE_FID; $url = strpos($url, 'admin') === 0 ? substr($url, 5) : $url; $url = trim($url, '/'); // 判断是否后台首页 if ($self != 'index.php' && ($url == 'home/index' || $url == 'home/home')) { return SELF; } if (!IS_ADMIN) { // 非后台统一index.php入口 if ($self == '/index.php') { // 表示相对路径 $self = dr_web_prefix('index.php'); } else { if (defined('IS_CLIENT')) { // 终端前缀 $self = CLIENT_URL.'index.php'; } elseif (\Phpcmf\Service::IS_MOBILE_TPL()){ // 移动端模板 域名 $self = SITE_MURL.'index.php'; } else { $self = SITE_URL.'index.php'; } } } $uri = []; $url = explode('/', $url); switch (dr_count($url)) { case 1: $uri['c'] = 'home'; $uri['m'] = $url[0]; break; case 2: $uri['c'] = $url[0]; $uri['m'] = $url[1]; break; case 3: $uri['s'] = $url[0]; // 非后台且非会员中心的模块地址 if (is_dir(APPSPATH . ucfirst($uri['s'])) && trim($self, '/') == 'index.php' && !IS_MEMBER) { $mod = \Phpcmf\Service::C()->get_cache('module-' . SITE_ID . '-' . $uri['s']); if ($mod['domain']) { unset($uri['s']); $self = (!\Phpcmf\Service::IS_MOBILE_TPL() ? $mod['url'] : dr_mobile_url($mod['url'])) . 'index.php'; } else { $self = (!\Phpcmf\Service::IS_MOBILE_TPL() ? SITE_URL : SITE_MURL) . 'index.php'; } } $uri['c'] = $url[1]; $uri['m'] = $url[2]; break; } $query && $uri = dr_array22array($uri, $query); return $self . '?' . http_build_query($uri); } /** * 会员url函数 * * @param string $url URL规则,如home/index * @param array $query 相关参数 * @return string 地址 */ public function member_url($url = '', $query = [], $null = '') { if (!$url || $url == 'member/home/index' || $url == 'home/index' || $url == '/') { return MEMBER_URL; } if (!$query && strpos($url, ':') !== false) { list($a, $b) = explode(':', $url); $url = $a; $query = $this->url2array($b); } $url = trim(str_replace('member/', '', $url), '/'); $url = explode('/', $url); $uri = ['s' => 'member']; switch (dr_count($url)) { case 1: $uri['c'] = 'home'; $uri['m'] = $url[0]; break; case 2: $uri['c'] = $url[0]; $uri['m'] = $url[1]; break; case 3: // 当存在三个参数时,表示模块或应用的会员中心 $url[0] != 'member' && is_dir(dr_get_app_dir($url[0])) && $uri['app'] = $url[0]; $uri['c'] = $url[1]; $uri['m'] = $url[2]; break; } $query && $uri = dr_array22array($uri, $query); // 未绑定域名的情况下 return (IS_CLIENT ? CLIENT_URL : (\Phpcmf\Service::IS_MOBILE_TPL() ? SITE_MURL : SITE_URL)).'index.php?' . http_build_query($uri); } /** * 模块栏目URL地址 * * @param array $mod * @param array $data * @param intval $page * @return string */ public function category_url($mod, $data, $page = 0, $fid = 0) { if (function_exists('dr_module_category_url')) { return dr_module_category_url($mod, $data, $page, $fid); } else { return '需要升级建站系统插件'; } } /** * 模块内容URL地址 * * @param array $mod * @param array $data * @param mod $page * @return string */ public function show_url($mod, $data, $page = 0) { if (function_exists('dr_module_show_url')) { return dr_module_show_url($mod, $data, $page); } else { return '需要升级建站系统插件'; } } /* * 单页URL地址 后期废弃 * * @param array $data * @param intval $page * @return string */ public function page_url($data, $page = 0) { return '请升级自定义页面插件'; } /** * tag的url */ public function tag_url($name) { if (!$name) { return 'TagURL name参数为空'; } elseif (!dr_is_app('tag')) { return '关键词库应用没有安装'; } $obj = \Phpcmf\Service::M('tag', 'tag'); if (method_exists($obj, 'tag_url')) { return $obj->tag_url($name); } return '关键词库插件未升级'; } // 缓存读取url public function get_tag_url($name, $mid = '') { if (!$name) { return '/#无name参数'; } if (dr_is_app('tag')) { $obj = \Phpcmf\Service::M('tag', 'tag'); if (method_exists($obj, 'get_tag_url')) { $url = $obj->get_tag_url($name); if ($url) { return $url; } } } if ($mid) { return $this->search_url([], 'keyword', $name, $mid); } return WEB_DIR; } // 模块URL public function module_url($mod, $sid) { if (function_exists('dr_module_index_url')) { return dr_module_index_url($mod, $sid); } else { return '需要升级建站系统插件'; } } /** * 搜索url组合 * * @param array $params 搜索参数数组 * @param string|array $name 当前参数名称 * @param string|array $value 当前参数值 * @param string $mid 强制定位到模块 * @param string $fid 指定fid * @return string */ public function search_url($params = [], $name = '', $value = '', $mid = '', $fid = SITE_FID) { if (function_exists('dr_module_search_url')) { return dr_module_search_url($params, $name, $value, $mid, $fid); } else { return '需要升级建站系统插件'; } } // 伪静态替换 public function get_url_value($data, $rule, $prefix) { $rep = new \php5replace($data); $url = (string)$rep->replace($rule); if (dr_is_url($url)) { return $url; // 带域名的url直接返回 } $url = ltrim(str_replace('//', '/', $url), '/'); if (IS_DEV && strpos($url, '?') !== false) { log_message('debug', '开发者模式提醒:自定义URL规则['.$rule.']不建议包含问号?'); } return $prefix.$url; } // 快捷登录地址 public function oauth_url($name, $type, $gourl = '') { return OAUTH_URL . 'index.php?s=api&c=oauth&m=index&name=' . $name . '&type=' . $type.'&back='.urlencode((string)$gourl); } // 地址前缀部分 public function url_prefix($type, $mod = [], $cat = [], $fid = 0) { $dir = isset($mod['dirname']) ? $mod['dirname'] : ''; if (\Phpcmf\Service::IS_MOBILE_TPL()) { $domain = isset($mod['domain_mobile']) ? $mod['domain_mobile'] : ''; } else { $domain = isset($mod['domain']) ? $mod['domain'] : ''; } if ($cat) { $dir = isset($cat['mid']) ? $cat['mid'] : $dir; } // 默认主网站的地址 $url = '/'; switch ($type) { // 动态模式 case 'php': $url = '/index.php?' . (!$mod || $domain ? '' : 's=' . $dir . '&') . (!$fid ? '' : 'fid=' . $fid . '&'); break; // 模块动态模式 case 'module_php': $url = '/index.php?' . ($mod['share'] || $domain ? '' : 's=' . $dir . '&') . (!$fid ? '' : 'fid=' . $fid . '&'); break; // 自定义url模式 case 'rewrite': $url = '/'; break; } return trim($url); } // 废弃 public function furl($fid) { if (!$fid) { return IS_CLIENT ? CLIENT_URL : SITE_URL; } // 自定义规则 $rule = \Phpcmf\Service::L('cache')->get('urlrule', SITE_REWRITE, 'value'); if ($rule && $rule['findex']) { return (IS_CLIENT ? CLIENT_URL : SITE_URL) . str_replace('{fid}', $fid, ltrim($rule['findex'], '/')); } else { return $this->url_prefix('php', [], [], $fid); } } // 去除url中的域名 public function remove_domain($url, $doamin = '') { if (!$this->_temp['domain']) { $site_domian = \Phpcmf\Service::R(WRITEPATH.'config/domain_site.php'); foreach ($site_domian as $u => $i) { $this->_temp['domain'][] = 'http://' . $u . '/'; $this->_temp['domain'][] = 'https://' . $u . '/'; } } if ($doamin) { $this->_temp['domain'][] = $doamin; } return str_replace($this->_temp['domain'], '', $url); } /** * 伪静态设置代码 */ public function rewrite_code() { $root = ''; $server = strtolower($_SERVER['SERVER_SOFTWARE']); if (strpos($server, 'apache') !== FALSE) { $name = 'Apache'; $note = ''.dr_lang('将以下内容保存为.htaccess文件,放到每个域名所绑定的根目录').''; $code = ''; $code.= 'RewriteEngine On'.PHP_EOL.PHP_EOL; $code.= 'RewriteBase '.$root.'/'.PHP_EOL .'RewriteCond %{REQUEST_FILENAME} !-f'.PHP_EOL .'RewriteCond %{REQUEST_FILENAME} !-d'.PHP_EOL .'RewriteRule !.(js|ico|gif|jpe?g|bmp|png|css)$ '.$root.'/index.php [NC,L]'.PHP_EOL.PHP_EOL; } elseif (strpos($server, 'nginx') !== FALSE) { $name = $server; $note = ''.dr_lang('将以下代码放到Nginx配置文件中去(如果是绑定了域名,所绑定目录也要配置下面的代码)').''; // 子目录 $code = '###当存在多个子目录格式的域名时,需要多写几组location标签:location /目录/ '.PHP_EOL; // 主目录 $code.= 'location '.$root.'/ { '.PHP_EOL .' if (-f $request_filename) {'.PHP_EOL .' break;'.PHP_EOL .' }'.PHP_EOL .' if ($request_filename ~* "\.(js|ico|gif|jpe?g|bmp|png|css)$") {'.PHP_EOL .' break;'.PHP_EOL .' }'.PHP_EOL .' if (!-e $request_filename) {'.PHP_EOL .' rewrite . '.$root.'/index.php last;'.PHP_EOL .' }'.PHP_EOL .'}'.PHP_EOL; } else { $name = $server; $note = ''.dr_lang('无法为此服务器提供伪静态规则,建议让运营商帮你把下面的Apache规则做转换').''; $code = 'RewriteEngine On'.PHP_EOL .'RewriteBase /'.PHP_EOL .'RewriteCond %{REQUEST_FILENAME} !-f'.PHP_EOL .'RewriteCond %{REQUEST_FILENAME} !-d'.PHP_EOL .'RewriteRule !.(js|ico|gif|jpe?g|bmp|png|css)$ /index.php [NC,L]'; } return [$name, $note, $code]; } /** * url参数转化成数组 */ public function url2array($query) { if (!$query) { return []; } $queryParts = explode('&', $query); $params = array(); foreach ($queryParts as $param) { $item = explode('=', $param); $params[$item[0]] = $item[1]; } return $params; } /** * 补空格 * * @param string $name 变量名称 * @return string */ protected function _space($name) { $str = ''; $len = strlen($name) + 2; $cha = 60 - $len; for ($i = 0; $i < $cha; $i ++) { $str .= ' '; } return $str; } ////////////////////////////////////////////////// // 评论地址 public function comment_url($id, $mid = '') { // 模块目录识别 defined('MOD_DIR') && MOD_DIR && $dir = MOD_DIR; $mid && $dir = $mid; if (!dr_is_module($dir)) { return '没有安装【'.$dir.'】模块'; } $obj = \Phpcmf\Service::M('comment', 'comment'); if (method_exists($obj, 'comment_url')) { return $obj->comment_url($id, $mid); } $module = \Phpcmf\Service::L('cache')->get('module-' . SITE_ID . '-' . $dir); return dr_url_prefix($this->url_prefix('php', $module, [], SITE_FID) . 'c=comment&id=' . $id); } // 打赏 public function donation_url($id, $mid = '') { if (!dr_is_app('shang')) { return '没有安装【打赏】应用'; } // 模块目录识别 defined('MOD_DIR') && MOD_DIR && $dir = MOD_DIR; $mid && $dir = $mid; if (!dr_is_module($dir)) { return '没有安装【'.$dir.'】模块'; } $obj = \Phpcmf\Service::M('buy', 'shang'); if (method_exists($obj, 'donation_url')) { return $obj->donation_url($id, $mid); } return $this->url_prefix('php', [], [], SITE_FID) . 's=shang&mid='.$dir.'&id=' . $id; } // 模块表单内容地址 public function mform_show_url($form, $id, $mid = '', $page = 0) { if (!dr_is_app('mform')) { return '没有安装【模块表单】应用'; } // 模块目录识别 defined('MOD_DIR') && MOD_DIR && $dir = MOD_DIR; $mid && $dir = $mid; if (!dr_is_module($dir)) { return '没有安装【'.$dir.'】模块'; } $obj = \Phpcmf\Service::M('mform', 'mform'); if (method_exists($obj, 'show_url')) { return $obj->show_url($form, $id, $mid, $page); } $module = \Phpcmf\Service::L('cache')->get('module-' . SITE_ID . '-' . $dir); return $this->url_prefix('php', $module, [], SITE_FID) . 'c=' . $form . '&m=show&id=' . $id . ($page > 1 || strlen($page) > 1 ? '&page=' . $page : ''); } // 模块表单提交地址 public function mform_post_url($form, $cid, $mid = '') { if (!dr_is_app('mform')) { return '没有安装【模块表单】应用'; } // 模块目录识别 defined('MOD_DIR') && MOD_DIR && $dir = MOD_DIR; $mid && $dir = $mid; if (!dr_is_module($dir)) { return '没有安装【'.$dir.'】模块'; } $obj = \Phpcmf\Service::M('mform', 'mform'); if (method_exists($obj, 'post_url')) { return $obj->post_url($form, $cid, $mid); } $module = \Phpcmf\Service::L('cache')->get('module-' . SITE_ID . '-' . $dir); return $this->url_prefix('php', $module, [], SITE_FID) . 'c=' . $form . '&m=post&cid=' . $cid; } // 模块表单列表地址 public function mform_list_url($form, $cid, $mid = '', $page = 0) { if (!dr_is_app('mform')) { return '没有安装【模块表单】应用'; } // 模块目录识别 defined('MOD_DIR') && MOD_DIR && $dir = MOD_DIR; $mid && $dir = $mid; if (!dr_is_module($dir)) { return '没有安装【'.$dir.'】模块'; } $obj = \Phpcmf\Service::M('mform', 'mform'); if (method_exists($obj, 'list_url')) { return $obj->list_url($form, $cid, $mid); } $module = \Phpcmf\Service::L('cache')->get('module-' . SITE_ID . '-' . $dir); return $this->url_prefix('php', $module, [], SITE_FID) . 'c=' . $form . '&m=index&cid=' . $cid . ($page > 1 || strlen($page) > 1 ? '&page=' . $page : ''); } // 网站表单内容地址 public function form_show_url($form, $id, $page = 0) { if (!dr_is_app('form')) { return '没有安装【全局网站表单】应用'; } $obj = \Phpcmf\Service::M('form', 'form'); if (method_exists($obj, 'show_url')) { return $obj->show_url($form, $id, $page); } return $this->url_prefix('php', [], [], SITE_FID) . 's=form&c=' . $form . '&m=show&id=' . $id . ($page > 1 || strlen($page) > 1 ? '&page=' . $page : ''); } // 网站表单提交地址 public function form_post_url($form) { if (!dr_is_app('form')) { return '没有安装【全局网站表单】应用'; } $obj = \Phpcmf\Service::M('form', 'form'); if (method_exists($obj, 'show_url')) { return $obj->post_url($form); } return $this->url_prefix('php', [], [], SITE_FID) . 's=form&c=' . $form . '&m=post'; } // 网站表单列表地址 public function form_list_url($form, $page = 0) { if (!dr_is_app('form')) { return '没有安装【全局网站表单】应用'; } $obj = \Phpcmf\Service::M('form', 'form'); if (method_exists($obj, 'show_url')) { return $obj->list_url($form, $page); } return $this->url_prefix('php', [], [], SITE_FID) . 's=form&c=' . $form . ($page > 1 || strlen($page) > 1 ? '&page=' . $page : ''); } public function get_rewrite_code() { return dr_return_data(0, '请升级建站系统插件'); } }