标签:
摘要:把$_SERVER[‘PATH_INFO‘]字符串按照配置的URL_PATHINFO_DEPR进行切分,区分出模块/控制器/方法
在lnmp环境下部署tp项目时,按照网上某资料nginx的配置文件修改了三个参数:PATH_INFO,SCRIPT_NAME,SCRIPT_FILENAME,系统已经可以正常运行。但是为什么不修改request_uri等其他参数呢?是不是这些参数没影响tp的路由策略?(注意:通过rewrite方式访问时,request_uri没有index.php这一部分)
带着这些疑问,我分析了tp的源码,发现在路由解析这一部分主要依赖$_SERVER[‘PATH_INFO‘]参数,另外两个参数在其他地方用到了,暂且不谈!从入口文件一直跟踪到Dispatcher::dispatch方法
/index.php==>/ThinkPHP/ThinkPHP.php==>/ThinkPHP/Library/Think/Think.clas.php/(run)==>ThinkPHP/Library/Think/App.class.php(init)==>
ThinkPHP/Library/Think/Dispatcher.class.php(dispatch)
下面是一些重点分析:
/********************* 获取控制器 *****************************/ define(‘__INFO__‘, trim($_SERVER[‘PATH_INFO‘], ‘/‘));//!!$_SERVER[‘PATH_INFO‘]出现了 // URL后缀 define(‘__EXT__‘, strtolower(pathinfo($_SERVER[‘PATH_INFO‘], PATHINFO_EXTENSION))); $_SERVER[‘PATH_INFO‘] = __INFO__; if (!defined(‘BIND_MODULE‘) && (!C(‘URL_ROUTER_ON‘) || !Route::check())) { if (__INFO__ && C(‘MULTI_MODULE‘)) { // 获取模块名 $paths = explode($depr, __INFO__, 2); $allowList = C(‘MODULE_ALLOW_LIST‘); // 允许的模块列表 $module = preg_replace(‘/\.‘ . __EXT__ . ‘$/i‘, ‘‘, $paths[0]); if (empty($allowList) || (is_array($allowList) && in_array_case($module, $allowList))) { $_GET[$varModule] = $module; //!!!重新設置$_GET[‘m‘]=module_name $_SERVER[‘PATH_INFO‘] = isset($paths[1]) ? $paths[1] : ‘‘;//!!!此时的$_SERVER[‘PATH_INFO‘]已经去掉了控制器所在的那一部分 } } } /****************** 获取控制器和动作 ************************/
$depr = C(‘URL_PATHINFO_DEPR‘);
$paths = explode($depr,trim($_SERVER[‘PATH_INFO‘],$depr));
if(!defined(‘BIND_CONTROLLER‘)) {// 获取控制器
if(C(‘CONTROLLER_LEVEL‘)>1){// 控制器层次
$_GET[$varController] = implode(‘/‘,array_slice($paths,0,C(‘CONTROLLER_LEVEL‘)));
$paths = array_slice($paths, C(‘CONTROLLER_LEVEL‘));
}else{
$_GET[$varController] = array_shift($paths);//!!!获取控制器
}
}
// 获取操作
if(!defined(‘BIND_ACTION‘)){
$_GET[$varAction] = array_shift($paths);//!!!获取方法
}
// 获取控制器和操作名
define(‘CONTROLLER_NAME‘, defined(‘BIND_CONTROLLER‘)? BIND_CONTROLLER : self::getController($varController,$urlCase));
define(‘ACTION_NAME‘, defined(‘BIND_ACTION‘)? BIND_ACTION : self::getAction($varAction,$urlCase));
标签:
原文地址:http://www.cnblogs.com/xueleixi/p/5448067.html