Thinkphp3.2.2 一个URL_MODEL的BUG?

浏览:6346 发布日期:2014/07/16 分类:技术分享 关键字: 3.2.2 URL_MODEL BUG
今天一个项目在应用apache的REWRITE重写时,由于应用了两个入口(home.php,admin.php),根据手册配置了tp的URL_MODEL为REWRITE模式(值2)时,出现一个问题,就是用入口2(admin.php)进入的时候,采用U('Login/login')的时候始终404,找了很久发现一个问题,就是在用'URL_MODEL'=>2的时候,U('Login/login')返回的并不是当前所在入口控制器中使用的模块。再找下去发现是__APP__这个值在'URL_MODEL'=>2的时候和其他情况不同,因此检查一下这个值的定义位置:

追溯到Think/Library/Think/Dispatcher.class.php line176-187        if($urlMode == URL_COMPAT ){// 兼容模式判断
            define('PHP_FILE',_PHP_FILE_.'?'.$varPath.'=');
        }elseif($urlMode == URL_REWRITE ) {
            $url    =   dirname(_PHP_FILE_);
            if($url == '/' || $url == '\\')
                $url    =   '';
            define('PHP_FILE',$url);
        }else {
            define('PHP_FILE',_PHP_FILE_);
        }
        // 当前应用地址
        define('__APP__',strip_tags(PHP_FILE));
如果各位不明白,看看测试代码:(其中有的值多余,但是省的各位亲检查手册,大牛请放过)echo '_PHP_FILE_:';dump(_PHP_FILE_);
echo 'dirname(_PHP_FILE_):';dump(dirname(_PHP_FILE_));
echo 'PHP_FILE:';dump(PHP_FILE);
echo '__APP__:';dump(__APP__);
echo '__MODULE__:';dump(__MODULE__);    
echo "U('Login/login',''):";            
dump(U('Login/login'));die();
结果如下,当'URL_MODEL'=>0,1,3的时候

当'URL_MODEL'=>2的时候


解决办法是当'URL_MODEL'=>2的时候,如果采用的是多入口,需要重新定义__APP__,也即在入口文件admin.php中重新定义define('__APP__','/blj/admin.php');当然还有个办法,就是除了home模块就不用'URL_MODEL'=>2了,各位自己斟酌。
我个人还是觉得这个应该是个bug,因为'URL_MODEL'这个参数只是控制URL样式,理论上修改其值是不需要修改代码的,当然如果官方在手册或者FAQ中特别说明就是我看的不仔细了。
第一次学习thinkphp框架,班门弄斧还望各位大牛见谅。
最佳答案
评论( 相关
后面还有条评论,点击查看>>