From 13ef244b80f23b59f42220e10a63055230f48915 Mon Sep 17 00:00:00 2001 From: thinkphp Date: Fri, 7 Oct 2016 14:45:57 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=B9=E8=BF=9B=E8=B7=AF=E7=94=B1=E7=9A=84ur?= =?UTF-8?q?l=E5=88=86=E9=9A=94=E7=AC=A6=E5=8F=82=E6=95=B0=20=E8=B7=AF?= =?UTF-8?q?=E7=94=B1=E8=A7=84=E5=88=99=E6=94=AF=E6=8C=81=E5=8D=95=E7=8B=AC?= =?UTF-8?q?=E8=AE=BE=E7=BD=AEurl=E5=88=86=E9=9A=94=E7=AC=A6=EF=BC=8C?= =?UTF-8?q?=E5=8F=82=E6=95=B0=E4=B8=BA=20param=5Fdepr?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修正url分隔符设置后 使用 / 仍然可以访问的问题,确保URL访问唯一性 --- library/think/Route.php | 70 ++++++++++++++++++++--------------------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/library/think/Route.php b/library/think/Route.php index c18a2d67..6a48960a 100644 --- a/library/think/Route.php +++ b/library/think/Route.php @@ -798,11 +798,9 @@ class Route public static function check($request, $url, $depr = '/', $checkDomain = false) { // 分隔符替换 确保路由定义使用统一的分隔符 - if ('/' != $depr) { - $url = str_replace($depr, '/', $url); - } + $url = str_replace($depr, '|', $url); - if (strpos($url, '/') && isset(self::$rules['alias'][strstr($url, '/', true)])) { + if (strpos($url, '|') && isset(self::$rules['alias'][strstr($url, '|', true)])) { // 检测路由别名 $result = self::checkRouteAlias($request, $url, $depr); if (false !== $result) { @@ -821,8 +819,8 @@ class Route if (false !== $return) { return $return; } - if ('/' != $url) { - $url = rtrim($url, '/'); + if ('|' != $url) { + $url = rtrim($url, '|'); } if (isset($rules[$url])) { // 静态路由规则检测 @@ -912,7 +910,7 @@ class Route if (isset($options['bind_model']) && isset($option['bind_model'])) { $option['bind_model'] = array_merge($options['bind_model'], $option['bind_model']); } - $result = self::checkRule($rule, $route, $url, $pattern, $option); + $result = self::checkRule($rule, $route, $url, $pattern, $option, $depr); if (false !== $result) { return $result; } @@ -938,7 +936,7 @@ class Route */ private static function checkRouteAlias($request, $url, $depr) { - $array = explode('/', $url, 2); + $array = explode('|', $url, 2); $item = self::$rules['alias'][$array[0]]; if (is_array($item)) { @@ -1000,7 +998,8 @@ class Route */ public static function bindToClass($url, $class, $depr = '/') { - $array = explode($depr, $url, 2); + $url = str_replace($depr, '|', $url); + $array = explode('|', $url, 2); $action = !empty($array[0]) ? $array[0] : Config::get('default_action'); if (!empty($array[1])) { self::parseUrlParams($array[1]); @@ -1018,7 +1017,8 @@ class Route */ public static function bindToNamespace($url, $namespace, $depr = '/') { - $array = explode($depr, $url, 3); + $url = str_replace($depr, '|', $url); + $array = explode('|', $url, 3); $class = !empty($array[0]) ? $array[0] : Config::get('default_controller'); $method = !empty($array[1]) ? $array[1] : Config::get('default_action'); if (!empty($array[2])) { @@ -1037,7 +1037,8 @@ class Route */ public static function bindToController($url, $controller, $depr = '/') { - $array = explode($depr, $url, 2); + $url = str_replace($depr, '|', $url); + $array = explode('|', $url, 2); $action = !empty($array[0]) ? $array[0] : Config::get('default_action'); if (!empty($array[1])) { self::parseUrlParams($array[1]); @@ -1055,7 +1056,8 @@ class Route */ public static function bindToModule($url, $controller, $depr = '/') { - $array = explode($depr, $url, 2); + $url = str_replace($depr, '|', $url); + $array = explode('|', $url, 2); $action = !empty($array[0]) ? $array[0] : Config::get('default_action'); if (!empty($array[1])) { self::parseUrlParams($array[1]); @@ -1095,21 +1097,22 @@ class Route * @param string $url URL地址 * @param array $pattern 变量规则 * @param array $option 路由参数 + * @param string $depr URL分隔符(全局) * @return array|false */ - private static function checkRule($rule, $route, $url, $pattern, $option) + private static function checkRule($rule, $route, $url, $pattern, $option, $depr) { // 检查完整规则定义 if (isset($pattern['__url__']) && !preg_match('/^' . $pattern['__url__'] . '/', $url)) { return false; } - // 检测是否设置了参数分隔符 - if ($depr = Config::get('url_params_depr')) { - $url = str_replace($depr, '/', $url); - $rule = str_replace($depr, '/', $rule); + // 检查路由的参数分隔符 + if (isset($option['param_depr'])) { + $url = str_replace('|', $depr, $url); + $url = str_replace($option['param_depr'], '|', $url); } - $len1 = substr_count($url, '/'); + $len1 = substr_count($url, '|'); $len2 = substr_count($rule, '/'); // 多余参数是否合并 $merge = !empty($option['merge_extra_vars']) ? true : false; @@ -1140,12 +1143,13 @@ class Route */ public static function parseUrl($url, $depr = '/', $autoSearch = false) { + if (isset(self::$bind['module'])) { // 如果有模块/控制器绑定 $url = self::$bind['module'] . '/' . ltrim($url, '/'); } - - list($path, $var) = self::parseUrlPath($url, $depr); + $url = str_replace($depr, '|', $url); + list($path, $var) = self::parseUrlPath($url); $route = [null, null, null]; if (isset($path)) { // 解析模块 @@ -1171,7 +1175,7 @@ class Route // 解析操作 $action = !empty($path) ? array_shift($path) : null; // 解析额外参数 - self::parseUrlParams(empty($path) ? '' : implode('/', $path)); + self::parseUrlParams(empty($path) ? '' : implode('|', $path)); // 封装路由 $route = [$module, $controller, $action]; if (isset(self::$rules['name'][implode($depr, $route)])) { @@ -1185,15 +1189,12 @@ class Route * 解析URL的pathinfo参数和变量 * @access private * @param string $url URL地址 - * @param string $depr URL分隔符 * @return array */ - private static function parseUrlPath($url, $depr = '/') + private static function parseUrlPath($url) { // 分隔符替换 确保路由定义使用统一的分隔符 - if ('/' != $depr) { - $url = str_replace($depr, '/', $url); - } + $url = str_replace('|', '/', $url); $url = trim($url, '/'); $var = []; if (false !== strpos($url, '?')) { @@ -1225,7 +1226,7 @@ class Route private static function match($url, $rule, $pattern, $merge) { $m2 = explode('/', $rule); - $m1 = $merge ? explode('/', $url, count($m2)) : explode('/', $url); + $m1 = $merge ? explode('|', $url, count($m2)) : explode('|', $url); $var = []; foreach ($m2 as $key => $val) { @@ -1300,7 +1301,7 @@ class Route if ($rule) { $rule = explode('/', $rule); // 获取URL地址中的参数 - $paths = $merge ? explode('/', $pathinfo, count($rule)) : explode('/', $pathinfo); + $paths = $merge ? explode('|', $pathinfo, count($rule)) : explode('|', $pathinfo); foreach ($rule as $item) { $fun = ''; if (0 === strpos($item, '[:')) { @@ -1315,7 +1316,7 @@ class Route } } } else { - $paths = explode('/', $pathinfo); + $paths = explode('|', $pathinfo); } // 获取路由地址规则 @@ -1372,7 +1373,7 @@ class Route } // 解析额外参数 - self::parseUrlParams(empty($paths) ? '' : implode('/', $paths), $matches); + self::parseUrlParams(empty($paths) ? '' : implode('|', $paths), $matches); // 记录匹配的路由信息 $request->routeInfo(['rule' => $rule, 'route' => $route, 'option' => $option, 'var' => $matches]); @@ -1432,12 +1433,11 @@ class Route * 解析URL地址为 模块/控制器/操作 * @access private * @param string $url URL地址 - * @param string $depr URL分隔符 * @return array */ - private static function parseModule($url, $depr = '/') + private static function parseModule($url) { - list($path, $var) = self::parseUrlPath($url, $depr); + list($path, $var) = self::parseUrlPath($url); $action = array_pop($path); $controller = !empty($path) ? array_pop($path) : null; $module = Config::get('app_multi_module') && !empty($path) ? array_pop($path) : null; @@ -1463,9 +1463,9 @@ class Route { if ($url) { if (Config::get('url_param_type')) { - $var += explode('/', $url); + $var += explode('|', $url); } else { - preg_replace_callback('/(\w+)\/([^\/]+)/', function ($match) use (&$var) { + preg_replace_callback('/(\w+)\|([^\|]+)/', function ($match) use (&$var) { $var[$match[1]] = strip_tags($match[2]); }, $url); }