“最难不过坚持”
本人承接扒站仿站,php网站维护,病毒查杀,网站编辑,网站改版,html制作
有需要网站维护,改版,病毒查杀,网站编辑,网站备案,html制作等相关的工作可以联系我。
本人有多年相关工作经验,也可提供免费咨询,交个朋友。
有需要探讨问题的朋友,也可以加我微信,共同探讨!
微信:15011482830 QQ:408917339
- https://jueru.net/
-
- :weixiao:
-
- :shuijiao: :weiqu: :zhenbang: :leng:
-
- :yiwen: :yiwen: :yiwen: :yiwen:
-
- 这个业务逻辑多少都有点奇怪了,阅读浏览次数增值在新闻详情页的控制器方法里setInc,这怎么还写进模型事件里了。如果非要用onAfterRead也可以,把新闻文章的内容单独分出来一个news_content表,然后把它和news做关联,然后给news_content表的onAfterRead事件做增值处理,这样点进新闻页内查询到文章内容时才会触发它。
-
最近用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,由此我将这一块代码改为
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从而可以正确访问。