Codeigniter 3.0.0 - 错误404页面未找到

5
这是我的第一个PHP框架。在我的控制器中有一个名为posts.php的PHP文件,但当我尝试在localhost/codeigniter/index.php/posts上运行它时,会显示404错误。
应该在应用程序文件夹中添加.htaccess文件。
<IfModule authz_core_module>
Require all denied
</IfModule>
<IfModule !authz_core_module>
Deny from all
</IfModule>

autoload.php

$autoload['libraries'] = array('database');
$autoload['helper'] = array('url');

config.php

$config['base_url'] = 'http://localhost/codeigniter/';
$config['index_page'] = 'index.php';

routes.php

$route['default_controller'] = 'welcome';
$route['404_override'] = '';
$route['translate_uri_dashes'] = FALSE;

模型文件夹中的post.php

    class Post extends CI_Model{

    function get_posts($num = 20, $start = 0){

        //$sql = "SELECT * FROM users WHERE active=1 ORDER BY date_added DESC LIMIT 0,20;";
        $this->db->select()->from('posts')->where('active', 1)->order_by('date_added', 'desc')->limit(0, 20);
        $query=$this->db->get();
        return $query->result_array();

    }

}

位于控制器文件夹中的posts.php

class Posts extends CI_Controller{

    function index(){

        $this->load->model('post');
        $data['posts'] = $this->post->get_posts();
        echo "<pre>";
            print_r($data['posts']);
        echo "</pre>";      

    }

}

它应该显示一个空数组,但却显示错误404。

如果您使用的是Codeigniter 3.0,则post.php控制器应该是Post.php。不要触碰应用程序文件夹中的htaccess,只需在主目录中添加一个即可。 - user4419336
另外,由于您尚未在配置中删除index.php并在主目录中设置.htaccess,则您的URL将需要包含index.php:http://www.example.com/index.php/controller。 - user4419336
嗨,不太确定你的意思,是应该像这样 $this->load->model('Post'); 吗? - rendell
我会将post模型重命名为Model_post.php,因为有时CodeIgniter会混淆控制器和模型,必须在文件名和类名的第一个字母大写,然后您可以使用$this->load->model('model_post')$this->model_post->function() - user4419336
4个回答

16

使用CodeIgniter 3时,所有的控制器和模型都应该将类名和文件名的首字母大写,例如 Welcome.php 而不是 welcome.php。

由于您的模型与控制器名称相同,建议将模型名称更改为 Model_post。

文件名: Model_post.php

<?php

class Model_post extends CI_Model {

    public function some_function() {

    }

}

这样CodeIgniter就不会混淆了。

Post控制器将会是:

文件名: Post.php

<?php

class Post extends CI_Controller {

    public function __construct() {
       parent::__construct();
       $this->load->model('model_post');
    }

   public function index() {
      $this->model_post->some_function();
   }

}

如果您没有设置CodeIgniter / htaccess来删除index.php,则在您的网址中,您的网址将需要在任何地方使用index.php。

http://localhost/project/index.php/post

http://www.example.com/index.php/post

注意:如果需要htaccess,请勿触摸应用程序文件夹中的htaccess,而是在主目录中添加一个。CodeIgniter专用Htaccess

在CodeIgniter v3及以上版本中,之前的版本不需要为控制器担心ucfirst,但现在需要。


目前我正在处理的问题是,类名和文件名的首字母大写不会造成问题。 - Linus
但我想问,如果我们编辑应用程序文件夹中的 .htaccess 文件会发生什么? - Linus
@AnmolRaghuvanshi 你是在使用CodeIgniter 2还是3?如果你想去掉index.php,你需要在主目录下有一个.htaccess文件以适应你的服务器。 - user4419336
我正在使用CI 3,我已经编辑了应用程序文件夹中的.htaccess文件,那么可能会出现什么问题? - Linus
1
@AnmolRaghuvanshi 应用程序文件夹htaccess只是使该目录安全,因此不要对其进行更改。要删除index.php,您需要在项目的主目录上选择适合您服务器的一个。 - user4419336

1
添加一个类似于以下的路由...
 $route['posts'] = 'posts/index';

编辑过了。这个问题与路由有关。如果您没有一个名为“index”的方法,则从可用的方法中选择适当的方法。我正在努力回忆我以前是如何解决这些问题的。您是否传递任何查询参数? - Mike Miller
还是不行,我编辑了我的问题并添加了我创建的函数。 - rendell

1

除了错误的路由配置之外,还有一种可能性。

当您的控制器名称看起来像这样:“ControllerName”时,我注意到了类似的问题。

要解决此问题,您只需将控制器重命名为“Controllername”即可。


0
在我的情况下,这解决了问题: 请转到config/routes.php并在第52行上定义默认控制器; 如果您需要另一个函数而不是index,则可以从index函数中调用该函数。但这取决于您。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接