為了讓URL支持中文,例如www.xxx.com/廣州/xx 需要在emptyAction中處理捕獲到的廣州/xxxx。但是TP默認的module名稱是不支持中文的。因此需要修改TP框架的PHP核心文件:
App.class.php
修改後的代碼:
Java代码
/** * 执行应用程序 * @access public * @return void */ static public function exec() { if(!preg_match('/^[A-Za-z](\w)*$/',MODULE_NAME) ){ // 安全检测 $module = false; }else{ //创建Action控制器实例 $group = defined('GROUP_NAME') && C('APP_GROUP_MODE')==0 ? GROUP_NAME.'/' : ''; //$module = A($group.MODULE_NAME); if(preg_match("/[\x7f-\xff]/", MODULE_NAME)){//中文模式 if(in_array(MODULE_NAME,C('CHINESE_MODULE_NAME'))){ //在指定的中文內 $module = A($group.'isTheEmpty'); }else{ _404(L('_MODULE_NOT_EXIST_').':'.MODULE_NAME); } }else{ $module = A($group.MODULE_NAME); } } if(!$module) { if('4e5e5d7364f443e28fbf0d3ae744a59a' == MODULE_NAME) { header("Content-type:image/png"); exit(base64_decode(App::logo())); } if(function_exists('__hack_module')) { // hack 方式定义扩展模块 返回Action对象 $module = __hack_module(); if(!is_object($module)) { // 不再继续执行 直接返回 return ; } }else{ // 是否定义Empty模块 $module = A($group.'Empty'); if(!$module){ _404(L('_MODULE_NOT_EXIST_').':'.MODULE_NAME); } } } // 获取当前操作名 支持动态路由 $action = C('ACTION_NAME')?C('ACTION_NAME'):ACTION_NAME; $action .= C('ACTION_SUFFIX'); try{ if(!preg_match('/^[A-Za-z](\w)*$/',$action)){ // 非法操作 throw new ReflectionException(); } //执行当前操作 $method = new ReflectionMethod($module, $action); if($method->isPublic()) { $class = new ReflectionClass($module); // 前置操作 if($class->hasMethod('_before_'.$action)) { $before = $class->getMethod('_before_'.$action); if($before->isPublic()) { $before->invoke($module); } } // URL参数绑定检测 if(C('URL_PARAMS_BIND') && $method->getNumberOfParameters()>0){ switch($_SERVER['REQUEST_METHOD']) { case 'POST': $vars = array_merge($_GET,$_POST); break; case 'PUT': parse_str(file_get_contents('php://input'), $vars); break; default: $vars = $_GET; } $params = $method->getParameters(); foreach ($params as $param){ $name = $param->getName(); if(isset($vars[$name])) { $args[] = $vars[$name]; }elseif($param->isDefaultValueAvailable()){ $args[] = $param->getDefaultValue(); }else{ throw_exception(L('_PARAM_ERROR_').':'.$name); } } $method->invokeArgs($module,$args); }else{ $method->invoke($module); } // 后置操作 if($class->hasMethod('_after_'.$action)) { $after = $class->getMethod('_after_'.$action); if($after->isPublic()) { $after->invoke($module); } } }else{ // 操作方法不是Public 抛出异常 throw new ReflectionException(); } } catch (ReflectionException $e) { // 方法调用发生异常后 引导到__call方法处理 $method = new ReflectionMethod($module,'__call'); $method->invokeArgs($module,array($action,'')); } return ; }
將需要支持的中文module名稱添加到config.php CHINESE_MODULE_NAME 配置數組中
這樣就能支持中文URL解析了。