thinkphp 模块不存在:404

Posted 翩跹公子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了thinkphp 模块不存在:404相关的知识,希望对你有一定的参考价值。

遇到的问题是:在thinkphp5.0框架下,出现错误----模块不存在:404?
错误详情

问题跟踪分析:
不管是打断点还是var_dump,都可以分析到 Request.php 下的函数

/**
     * 获取当前请求URL的pathinfo信息(含URL后缀)
     * @access public
     * @return string
     */
    public function pathinfo()
    {
        if (is_null($this->pathinfo)) {
            if (isset($_GET[Config::get(\'var_pathinfo\')])) {
                // 判断URL里面是否有兼容模式参数
                $_SERVER[\'PATH_INFO\'] = $_GET[Config::get(\'var_pathinfo\')];
                unset($_GET[Config::get(\'var_pathinfo\')]);
            } elseif (IS_CLI) {
                // CLI模式下 index.php module/controller/action/params/...
                $_SERVER[\'PATH_INFO\'] = isset($_SERVER[\'argv\'][1]) ? $_SERVER[\'argv\'][1] : \'\';
            }

            // var_dump($_SERVER);exit();
            // 分析PATHINFO信息
            if (!isset($_SERVER[\'PATH_INFO\'])) {
                foreach (Config::get(\'pathinfo_fetch\') as $type) {
                    if (!empty($_SERVER[$type])) {
                        $_SERVER[\'PATH_INFO\'] = (0 === strpos($_SERVER[$type], $_SERVER[\'SCRIPT_NAME\'])) ?
                        substr($_SERVER[$type], strlen($_SERVER[\'SCRIPT_NAME\'])) : $_SERVER[$type];
                        break;
                    }
                }
            }
            $this->pathinfo = empty($_SERVER[\'PATH_INFO\']) ? \'/\' : ltrim($_SERVER[\'PATH_INFO\'], \'/\');
        }
        return $this->pathinfo;
    }

 

在 "分析PATHINFO信息" 中看到 断点输出 超全局变量 $_SERVER
超全局变量$_SERVER
从代码逻辑上来分析,pathinfo的取值 是从 超全局变量中$_SERVER  以这些 [\'ORIG_PATH_INFO\', \'REDIRECT_PATH_INFO\', \'REDIRECT_URL\'](从Config配置里获取)为key的值中获取,一旦获得值,终止,从上图可以看出,REQUEST_URI为key的值符合我们的逻辑,故有的解决方法是在配置的数组里加上REQUEST_URI,放在第一位,我最初也是这样来解决这个问题的。

在设置好后,确实页面可以访问了,

但是返回的状态码竟然是404.
看来问题还是得回到超全局变量 $_SERVER 来,为什么他的这些参数[\'ORIG_PATH_INFO\', \'REDIRECT_PATH_INFO\', \'REDIRECT_URL\']是 404,延伸到 超全局变量 $_SERVER 是怎么来的?
超全局变量 $_SERVER 是怎么来的 这个问题,我也不是很了解,只是在网上了解到和Apach或者nginx有关(看你的服务部署情况),我的是Apach。
thinkphp和Apache的配置相关的话,就是public下的.htaccess文件

<IfModule mod_rewrite.c>
Options +FollowSymlinks -Multiviews
RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f

RewriteRule ^([^(Public/)]+.*)$ index\\.php [L,E=PATH_INFO:$1]
</IfModule>

和thinkphp官方的对比下,
https://www.kancloud.cn/manual/thinkphp5/177576

RewriteRule ^([^(Public/)]+.*)$ index\\.php [L,E=PATH_INFO:$1]

就是这个的问题,改为

RewriteRule ^(.*)$ index.php?/$1 [QSA,PT,L]

 

这个问题就从根本上解决了!!其他的不用去改变。。。

 

以上是关于thinkphp 模块不存在:404的主要内容,如果未能解决你的问题,请参考以下文章

Thinkphp空操作空模块

thinkPHP到底怎么设置404错误页面

Thinkphp设置仅在调试模式关闭时显示404页面

Thinkphp设置仅在调试模式关闭时显示404页面

ThinkPHP3.2设置404跳转页面

thinkphp 5.0如何实现自定义404(异常处理)页面