首先,先将镜像用工具先仿真。
当时的题目是:将网站后台入口地址改成“GYS”,并通过 http(s)://域名/Gys访问网站的后台,并截图后台界面。
之前对ThinkPHP框架只是做了一个初步的理解。在ThinkPHP5与之前版本的框架构造是不一样的,这可能意味着ThinkPHP默认入口地址会不同,以是我先对网站ThinkPHP框架的版本进行了查找。
我利用了最大略查找ThinkPHP版本的方法,将源码下载到本地,利用FileLocator Pro工具进行检索。这个FileLocator Pro是一个无索引全文搜索的工具,目前我个人用的是比较多的。ThinkPHP默认储存版本号的关键字是“THINK_VERSION”,我们通过关键字对网站源码进行查找,找到了网站是采取ThinkPHP 5.1版本进行设计的。
那么我们有针对性的去搜索一下“ThinkPHP 5.1”默认的后台入口地址是什么。通过查找,ThinkPHP 5 可以通过application下的config.php文件查看到入口地址,那么我们找到这个目录。
这套源码的Config文件在 /Application/Common/Conf 目录下面。
找到了疑似网站后台上岸入口,这里有两个关键字,一个是“login”一个是“admin”,那开始我并不清楚哪个是精确的入口,干脆都访问试一下吧。
访问“login”创造可以正常进入到网站后台,我也创造后面有一个备注,提示“模块路由映射”,为了搞清楚为什么是“login”入口地址,再次利用万能的百度。经由一系列的资料查询创造,在ThinkPHP中,如果不肯望用户直接访问某个模块,可以设置模块映射(对后台的保护会比较实用)。
代码:'URL_MODULE_MAP' => array('xxx'=>'admin'),这个xxx便是可以修正成我们须要的入口字符。设置了模块映射后,原来的Admin模块将不能访问,只能访问我们修正后的xxx模块。
我们访问 http://域名/Admin将会报模块不存在的缺点,而http://域名/test则可以正常访问Admin模块。如果还有“MODULE_ALLOW_LIST”参数,还须要把“xxx”更换进去才能生效。
代码:'MODULE_ALLOW_LIST' => array('Home','Admin','User'),要将“Admin”更换成我们修正后的样子,也便是 'MODULE_ALLOW_LIST' => array('Home','Xxx','User')。
我们回到题目上来,我们将“URL_MODULE_MAP”参数修正一下,是不是就可以了?'URL_MODULE_MAP' => array('gys' => 'admin')。
怎么回事?竟然提示“无法加载模块:Gys”。
明明已经修正完成了,为什么还是报错呢?是不是有浏览器缓存。那我直接将浏览器缓存、WEB做事器、PHP全部重启。
还是弗成,难道是ThinkPHP有缓存文件?代码里有一段确实写的获取实际的模块名。
带着疑问,我们再次请教“度娘”,有针对性的去搜索“ThinkPHP缓存文件、目录”等关键字。
定位到了问题,ThinkPHP下有缓存目录“runtime”。第一次运行时,如果没有开通app_debug会产生runtime.php文件,往后每次运行都会判断是否开启,并且是否有runtime文件,如果有则利用,没有则创建。
在这个Runtime目录下有缓存文件,如果是新增或者修正字段,须要打消缓存文件。否者我们会创造,怎么修正都不起浸染。可以把全体Runtime文件夹都删除。
实在我们到缓存文件里找一下“URL_MODULE_MAP”的参数还是之前的“login”。
为了判断这个方案是否精确,我将缓存文件里的“login”改为“ceshi”试一下。
成功访问,看来便是这个缓存文件在作怪。
接下来我们直接删除这个缓存文件。
如果没生效就重启一下Nginx做事,或是打消一下浏览器缓存,再重新访问我们之前在 Config.php 设置好的“Gys”入口地址,这套题目就成功办理了。
末了,这套题目还有其他的坑,例如“某某界面映射后的地址为?”。由于我们设置了模块映射后,有部分url不能进行更换。
后类似如U('Admin/index/index/param1/1/param2/2/p3/3')的就不能精确映射,这是由于U函数的问题,更多参数时无法查找到对应映射关系。那么,再一次请“度娘”出山。
将文件 Common/functions.php 中U方法:
if($maps = C('URL_MODULE_MAP')) {
if($_module = array_search(strtolower($var[$varModule]),$maps)){
$var[$varModule] = $_module;
}
}
修正为:
if($maps = C('URL_MODULE_MAP')) {
$temp = explode($depr,$var[$varModule]);
if($temp[0] = array_search(strtolower($temp[0]),$maps)){
$var[$varModule] = implode($depr,$temp);
}
}
问题办理!
这个U方法也给出理解释:thinkphp的u方法用于完成对URL地址的组装,特点在于可以自动根据当前的URL模式和设置天生对应的URL地址。
经由这次搜索学习,又Get到了一个知识点。不过创造最近的做事器镜像题目,网站源码都是ThinkPHP架构的,特殊是这种公开的架构,很多配置文件都是在指定目录的,能让我们更快重修网站。