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]

 

這個問題就從根本上解決了!!其他的不用去改變。。。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM