使用Codeigniter 1.7.2 + HMVC在日志中找不到404页面

时间:2011-01-02 01:05:46

标签: php .htaccess codeigniter codeigniter-url hmvc

我正在使用Codeigniter 1.7.2和HMVC(https://bitbucket.org/wiredesignz/codeigniter-modular-extensions-hmvc/wiki/Home)。

我有这些文件,它们是根据HMVC组织的:

system/application/modules/welcome/controllers/welcome.php
system/application/modules/welcome/views/index.php

routes.php中,我设置了一条路线:

routes['welcome']='welcome/index';

如果网址采用此模式,则一切正常: http://www.mydomain.com/index.php/welcome

但是现在我想从url中删除index.php,所以我创建了.htaccess文件:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php?$1 [L]

然后我将$config['index_page']设置为空:

$config['index_page'] = "";

现在我可以使用此网址格式访问该页面: http://www.mydomain.com/welcome

虽然一切似乎都有效,但我发现每次访问该页面时,都会在日志中生成404页面未找到错误:

DEBUG - 2011-01-02 08:28:52 --> URI Class Initialized
ERROR - 2011-01-02 08:28:52 --> 404 Page Not Found --> 

这不是welcome页面特有的,所有页面都有同样的问题。 我深入研究了这些代码,发现这条404 Page Not Found消息是从HMVC附带的MX_Router.php生成的。具体来说,它来自这个功能:

public function _validate_request($segments) {      

    /* locate module controller */
    if ($located = $this->locate($segments)) return $located;

    /* use a default 404 controller */
    if (isset($this->routes['404']) AND $segments = explode('/', $this->routes['404'])) {
        if ($located = $this->locate($segments)) return $located;
    }   

    /* use a default 404_override controller CI 2.0 */
    if (isset($this->routes['404_override']) AND $segments = explode('/', $this->routes['404_override'])) {
        if ($located = $this->locate($segments)) return $located;
    }

    /* no controller found */
    show_404();
}

这是被调用的show_404()函数,因此我收到了该错误消息。但是因为我可以使用已删除index.php的网址格式访问每个页面而没有任何问题。

为什么HMVC认为在这个_validate_request()函数中找不到控制器? 如果我还原更改,我将不会在日志中收到404错误消息,但这也意味着我必须继续使用具有index.php的url模式,这看起来非常糟糕。

之前有人遇到过同样的问题吗? 非常感谢你们所有人。

2 个答案:

答案 0 :(得分:3)

我认为问题在某种程度上与favicon.ico有关,一些网页浏览器会自动请求yourdomain.com/favicon.ico,如果没有可用的,它会在日志中生成404错误。

答案 1 :(得分:0)

可能错误出现在.htaccess文件中。官方user guide实际上有一个例子:

RewriteEngine on
RewriteCond $1 !^(index\.php|images|robots\.txt)
RewriteRule ^(.*)$ /index.php/$1 [L]

.htaccess中的此代码是否仍会出现此问题?