TP5项目放在二级目录下重定向访问不对问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010454239/article/details/78922731

最近用Thinkphp5做了一个小网站,发现当PHP版本切换成5.5以上版本后
如果访问地址是全地址 如loacalhost/index/index/index重定向不起作用,提示:No input file specified.
此问题比较好解决,原因是php版本5.5以上项目下的重定向文件.htaccess的语法不支持,重定向失败,只要将文件代码改动一下。将第七行的 RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]换为RewriteRule ^(.*)$ index.php?$1 [QSA,PT,L]即可。
但是此问题引出了另外一个问题,我的项目不是放在网站根目录的,是放在网站根目录下的二级目录(假设此目录名为rizhi),我访问时需要访问地址localhost/rizhi/index/index/index,经过我上面修改后地址会重定向为
localhost/rizhi/index.php?rizhi/index/index/index这样Tp5核心文件会去寻找rizhi模块而不是index模块会报模块不存在错误:
模块不存在
我就去排查其原因发现在 rizhi(我的项目目录)/thinkphp/library/think/Request.php文件里面的pathinfo()函数获取的pathinfo数据不对,当我们把重定向的文件由/改为?后pathinfo()函数的解析走的是
这里写图片描述
如果我们目录放在网站根目录下访问localhost/index/index/index这里段代码会匹配一下域名(localhost)后面的字符串是否以/index.php开头如果是就去掉/index.php返回剩余部分字符串不是则直接返回字符串,所以上返回值都为index/index/index,thinkphp后续会根据它判断模块/控制器/action,可以得到正确结果。
但是如果我们的网站是放在网站二级目录或者三级(或更多)目录下,那么返回的结果将是错误的,假设我的项目放在网站根目录/aa/bb/目录下,我的访问方式为localhost/aa/bb/index/index/index,此方法会匹配
/aa/bb/index/index/index是否以/aa/bb/index.php开头,这样匹配不成功不能得到正确的返回值index/index/index,由此我将这一块代码改为

  // 分析PATHINFO信息
            if (!isset($_SERVER['PATH_INFO'])) {
                foreach (Config::get('pathinfo_fetch') as $type) {
                    if (!empty($_SERVER[$type])) {
                        $path = explode('/',$_SERVER['SCRIPT_NAME']);
                        $_SERVER['PATH_INFO'] = $_SERVER[$type];
                        foreach($path as $value){
                            if(!empty($value)){
                                $_SERVER['PATH_INFO'] = (0 === strpos( $_SERVER['PATH_INFO'], '/'.$value)) ?
                                    substr( $_SERVER['PATH_INFO'], strlen('/'.$value)) : $_SERVER['PATH_INFO'];
                            }
                        }
//                        $_SERVER['PATH_INFO'] = (0 === strpos($_SERVER[$type], $_SERVER['SCRIPT_NAME'])) ?
//                        substr($_SERVER[$type], strlen($_SERVER['SCRIPT_NAME'])) : $_SERVER[$type];
                        break;
                    }
                }
            }

将aa/bb/index.php拆开,分别匹配是否以/aa开头如果是则去除/aa然后再次判断是否以/bb开头……直到判断完为止。这样就能把/aa、/bb、/index.php全部去除,得到我们想要的index/index/index从而可以正确访问。

猜你喜欢

转载自blog.csdn.net/u010454239/article/details/78922731