最近用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从而可以正确访问。
ps还加点东西
改了后css,js映入有点问题 反正..........我的解决方法就是 ROOT 函数引入的 不然就得去那个路径下放 如果有解决的小伙伴留言我 谢谢