TP5项目放在二级目录下重定向访问不对问题
web ThinkPHP5.1 2023-08-28 782 0
关于本站

“最难不过坚持”

本人承接扒站仿站,php网站维护,病毒查杀,网站编辑,网站改版,html制作

有需要网站维护,改版,病毒查杀,网站编辑,网站备案,html制作等相关的工作可以联系我。
本人有多年相关工作经验,也可提供免费咨询,交个朋友。
有需要探讨问题的朋友,也可以加我微信,共同探讨!
微信:15011482830 QQ:408917339

7440320 2655 39
最新评论
https://jueru.net/
评 留言
:weixiao:
评 留言
:shuijiao: :weiqu: :zhenbang: :leng:
评 留言
:yiwen: :yiwen: :yiwen: :yiwen:
评 EasySass: could not generate CSS file. See Output panel for details.
这个业务逻辑多少都有点奇怪了,阅读浏览次数增值在新闻详情页的控制器方法里setInc,这怎么还写进模型事件里了。如果非要用onAfterRead也可以,把新闻文章的内容单独分出来一个news_content表,然后把它和news做关联,然后给news_content表的onAfterRead事件做增值处理,这样点进新闻页内查询到文章内容时才会触发它。
评 TP6模型事件-查询后onAfterRead不好用
文章标签更多
ThinkPHP (254)
Mysql (58)
DedeCms (33)
jQuery (67)
证件照 (1)
setInc (4)
setDec (4)
onclick (5)
打开边栏(ESC) 关闭边栏(ESC)

最近用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模块会报模块不存在错误:

from clipboard

我就去排查其原因发现在 rizhi(我的项目目录)/thinkphp/library/think/Request.php文件里面的pathinfo()函数获取的pathinfo数据不对,当我们把重定向的文件由/改为?后pathinfo()函数的解析走的是

from clipboard

如果我们目录放在网站根目录下访问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,由此我将这一块代码改为

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'];
                }
            }
            break;
        }
    }
}
我的是thinkphp5.1.40 LTS
修改代码稍微不同
// 分析PATHINFO信息
            if (!isset($pathinfo)) {                
                foreach ($this->config['pathinfo_fetch'] as $type) {
                    if (!empty($this->server($type))) {
                        $path = explode('/',$this->server('SCRIPT_NAME'));
                        $pathinfo = $this->server($type);
                        foreach($path as $value){
                            if(!empty($value)){
                                $pathinfo = (0 === strpos( $pathinfo, '/'.$value)) ?
                                    substr( $pathinfo, strlen('/'.$value)) : $pathinfo;
                            }
                        }
                        break;
                    }
                }
            }

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

版权声明:本篇文章来源于网络。 来源链接

相关推荐
Non-static method think\Config::get() should not be called statically
ThinkPHP5.1 | 2018-12-29 10949
原来是这样use think\Config; 改成这样use think\facade\Config; 下面是官方手册的解释 配置获取 要使用Config类,首先需要在你的类文件中引入 use think\facade\Config; 或者(因为系统做了类库别名,其实就是调用think\facade\Config) u...
thinkPHP5 order多条件排序
ThinkPHP5.1 | 2017-10-24 10809
总结如下: //单一条件排序 $user = $this->where(['parentId'=>0)->field('userId,userName,userSort,isShow')->order('userSort', 'asc')->select(); //多个条件排序,可以多加一个order...
评论:0条
评论加载中...
发表评论