Codeigniter URL在Web服务器上不起作用

I was developing in XAMPP environment on my local machine, and everything is fine. I can access my controller like this:

localhost/myproject/index.php/catalog/home/get

catalog is the sub folder under controllers.

However, after I uploaded my project to the server. I should be able to access my page by the following url:

http://www.example.com/index.php/catalog/home/index

but this gives me a 404 page.

The only url works is the default page I defined in the route.php file:

$route['default_controller'] = 'welcome';

In the config.php, I set my base_url to be http://www.example.com/

All my controllers' first letter are capitalized and I'm using CI 3.1X. My server is a linux which uses nginx instead of apache. I tried to modify or delete my .htaccess file, but it doesn't solve my problem.

I'm not looking for an exact answer, I would like to know how to debug my code in this situation.

Here is an example of one of my controllers:

<?php

class Survey extends CI_Controller
{

    public function __construct()
    {
        parent::__construct();
        $this->load->model('catalog/model_survey');
        $this->load->helper('url');
    }

    public function index()
    {
        $error = $this->input->get('error');

        if (isset($error)) {
            $data['error'] = true;
        } else {
            $data['error'] = false;
        }

        $data['action'] = "index.php/catalog/success";
        $data['base'] = base_url();

        $this->load->view('catalog/survey', $data);
    }
}

Here is my folder structure:

application
|-- cache
|-- config
|-- controllers
|   |-- admin
|   |   |-- common
|   |   |-- redpacket
|   |   |-- setting
|   |   `-- tools
|   `-- catalog
|-- core
|-- helpers
|-- hooks
|-- language
|   |-- chinese
|   |   `-- admin
|   |       |-- common
|   |       |-- redpacket
|   |       |-- setting
|   |       `-- tools
|   `-- english
|       `-- admin
|           `-- common
|-- libraries
|-- logs
|-- models
|   |-- admin
|   |   |-- common
|   |   |-- redpacket
|   |   |-- setting
|   |   |-- tools
|   |   `-- user
|   `-- catalog
|-- third_party
`-- views
|-- admin
    |   |-- common
    |   |-- redpacket
    |   |-- setting
    |   `-- tools
    |-- catalog
    `-- errors
|-- cli
        `-- html

After comparing my local environment and the production environment, I found that I'm using Apache on my local machine, but nginx on the server. Thus, I'm guessing the problem would be the setting of my nginx config file.

After doing some research, this is what I found online: https://www.nginx.com/resources/wiki/start/topics/recipes/codeigniter/?highlight=codeigniter

I modified my nginx config file to this, and everything works fine now. By using this config, it also get rid of the index.php in the url. You can access the web by type http://www.example.com/survey, or if you did what I did, adding a sub folder under controller, just simply add your sub folder in the url http://www.example.com/catalog/survey

it looks like you forgot to update .htaccess file on the server

Consider the following checklist.

  1. Check Controller file name Survey.php, S must be capital.
  2. Check folder name catalog for case sensitivity.
  3. Same for view and models.

I use following .htaccess code in most of my projects.

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ index.php/$1 [L]

</IfModule>

Edited answer:

In your given directory hierarchy, all your controller and model names are in lower case. As per the CI 3.X standard, the Classes first character is capitalized and the same is applicable for their respective files.

localhost/myproject/index.php/catalog/home/get

Here localhost is hostname, myproject is project name catalog is controller sub folder name, home is controller name, and get is function under home controller.

in Home make H capital as it is class name, and check .htaccess file