function url_ext() { $rewrite_rules = cpConfig::get('URL_REWRITE_RULE'); if (!empty($rewrite_rules)) { if (($pos = strpos($_SERVER['REQUEST_URI'], '?')) !== false) { parse_str(substr($_SERVER['REQUEST_URI'], $pos + 1), $_GET); } $rewrite_rules['<m>/<a>'] = '<m>/<a>'; foreach ($rewrite_rules as $rule => $mapper) { if (0 !== stripos($rule, 'http://')) { $rule = 'http://' . $_SERVER['HTTP_HOST'] . rtrim(dirname($_SERVER["SCRIPT_NAME"]), '/\\') . '/' . $rule; } $rule = '/' . str_ireplace(array('\\\\', 'http://', '/', '<', '>', '.'), array('', '', '\\/', '(?<', '>\\w+)', '\\.'), $rule) . '/i'; if (preg_match($rule, 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'], $matchs)) { foreach ($matchs as $matchkey => $matchval) { if ('c' === $matchkey) { $mapper = str_ireplace('<m>', $matchval, $mapper); } elseif ('a' === $matchkey) { $mapper = str_ireplace('<a>', $matchval, $mapper); } else { if (!is_int($matchkey)) { $_GET[$matchkey] = $matchval; } } } list(cpApp::$module, cpApp::$action) = explode('/', $mapper); break; } } } else { cpApp::$module = $_GET['m']; cpApp::$action = $_GET['a']; } }
private function _parseUrl() { $script_name = $_SERVER["SCRIPT_NAME"]; //获取当前文件的路径 $url = $_SERVER["REQUEST_URI"]; //获取完整的路径,包含"?"之后的字符串 //去除url包含的当前文件的路径信息 if ($url && @strpos($url, $script_name, 0) !== false) { $url = substr($url, strlen($script_name)); } else { $script_name = str_replace(basename($_SERVER["SCRIPT_NAME"]), '', $_SERVER["SCRIPT_NAME"]); if ($url && @strpos($url, $script_name, 0) !== false) { $url = substr($url, strlen($script_name)); } } //第一个字符是'/',则去掉 if ($url[0] == '/') { $url = substr($url, 1); } //去除问号后面的查询字符串 if ($url && false !== ($pos = @strrpos($url, '?'))) { $url = substr($url, 0, $pos); } //去除后缀 if ($url && ($pos = strrpos($url, $this->appConfig['URL_HTML_SUFFIX'])) > 0) { $url = substr($url, 0, $pos); } $flag = 0; //获取模块名称 if ($url && ($pos = @strpos($url, $this->appConfig['URL_MODULE_DEPR'], 1)) > 0) { self::$module = substr($url, 0, $pos); //模块 $url = substr($url, $pos + 1); //除去模块名称,剩下的url字符串 $flag = 1; //标志可以正常查找到模块 } else { //如果找不到模块分隔符,以当前网址为模块名 self::$module = $url; } $flag2 = 0; //用来表示是否需要解析参数 //获取操作方法名称 if ($url && ($pos = @strpos($url, $this->appConfig['URL_ACTION_DEPR'], 1)) > 0) { self::$action = substr($url, 0, $pos); //模块 $url = substr($url, $pos + 1); $flag2 = 1; //表示需要解析参数 } else { //只有可以正常查找到模块之后,才能把剩余的当作操作来处理 //因为不能找不到模块,已经把剩下的网址当作模块处理了 if ($flag) { self::$action = $url; } } //解析参数 if ($flag2) { $param = explode($this->appConfig['URL_PARAM_DEPR'], $url); $param_count = count($param); for ($i = 0; $i < $param_count; $i = $i + 2) { $_GET[$i] = $param[$i]; if (isset($param[$i + 1])) { if (!is_numeric($param[$i])) { $_GET[$param[$i]] = $param[$i + 1]; } $_GET[$i + 1] = $param[$i + 1]; } } } }