Warning: Error while sending QUERY packet. PID=4753 in /home/wwwroot/coco/domain/cnlamp/web/wp-includes/wp-db.php on line 1877 Thinkphp3.2.1 3.2.2 域名部署bug修复 | LAMP新闻|技巧|经验|资讯站
现在的位置: 首页PHP>正文
Thinkphp3.2.1 3.2.2 域名部署bug修复
发表于3年前 PHP 评论数 3

1、thinkphp3.2版本在进行域名部署时存在bug

举例说明:

绑定域名:test.abc.com。 绑定到模块test中

现在访问test模块下的控制器方法,则url是 test.abc.com/index/index  这是访问test模块下的index控制器的index方法。

但是test/index/index页面中有存在其他模块的链接页面,例如,要访问test2模块下面的页面,test2/other/index,使用U函数,U(“test2/other/index”),则U函数返回的结果是/other/index那么当访问这个链接的时候,就会变为 test.abc.com/other/index。但是test模块下并没有other这个控制器,所以产生无法找到控制器的错误。

2、U函数bug,在开通域名部署后返回链接地址错误。

如1所述,开通域名部署以后,U函数会自动将地址中的模块名去掉,如果不在同一个模块中,就出错了。

3、解决方式:

(1)  不使用U函数,直接写完整的url地址,带域名的。

(2) 使用U函数,修改thinkphp的内核文件,使之变为,如果U中的第一个参数中包含模块名称,则先判断U中填写的模块名称与部署的域名指向的模块名称是否一致,如果不一样,继续使用U中填写的模块名称,如果一样,按照目前的处理方式,去掉模块名称,使用域名指向的模块。

4、如何修改:

(1)修改ThinkPHP\Library\Think\Dispatcher.class.php文件

在文件的(131行)后插入代码:

if(__INFO__ && defined('BIND_MODULE') && C('MULTI_MODULE')){
    $paths = explode($depr,__INFO__,2);
    $allowList = C('MODULE_ALLOW_LIST'); // 允许的模块列表
    $module = preg_replace('/\.' . __EXT__ . '$/i', '',$paths[0]);
 
    if($module && is_array($allowList) && in_array_case($module, $allowList)){
        $module_name = $module;
        $_GET[$varModule] = $module;
        $_SERVER['PATH_INFO'] = isset($paths[1])?$paths[1]:'';
    }
    else{
        $module_name = defined('BIND_MODULE')? BIND_MODULE : self::getModule($varModule);
    }
}

文件的138行,替换为

define('MODULE_NAME', $module_name ? ucwords($module_name) : (defined('BIND_MODULE')? BIND_MODULE : self::getModule($varModule)));

文件的190行,替换为:

define('__MODULE__',(!C('MULTI_MODULE'))? __APP__ : __APP__.'/'.($urlCase ? strtolower($moduleName) : $moduleName));

(2)修改ThinkPHP\Common\functions.php文件
文件910行替换为:

 $module = ucwords($module);
 $module = defined('BIND_MODULE') ? (BIND_MODULE == $module ? '' : $module) : $module;

如果您使用的是thinkphp3.2.2,并且没有更改过thinkphp的核心文件,可直接下载覆盖http://www.kuaipan.cn/file/id_14286800688254024.htm?source=1

给我留言

留言无头像?


×
腾讯微博