404 errors with controller files using CodeIgniter

2019-09-17 05:29发布

问题:

I have a server running NGINX 1.10.0 and installed CodeIgniter 3 in a subdirectory /ci/. The welcome page renders when I go to the subdirectory but any other controller gives a 404 error.

Here is the code in /etc/nginx/sites-available/default configuration file:

server {
    server_name mydomain.org;
    root /home/username/mydomain/;
    index index.php index.html index.htm;
    location / {
        try_files $uri $uri/ /index.php;
    }

    location ~* ^.+.(jpg|jpeg|gif|css|png|js|ico|xml)$ {
        expires           15d;
    }

    location ~ \.php$ {
        include /etc/nginx/fastcgi_params;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /home/username/mydomain/ci/index.php;
        fastcgi_param  REQUEST_URI      $request_uri;
        fastcgi_param  QUERY_STRING     $query_string;
        fastcgi_param  REQUEST_METHOD   $request_method;
        fastcgi_param  CONTENT_TYPE     $content_type;
        fastcgi_param  CONTENT_LENGTH   $content_length;
        fastcgi_pass   unix:/run/php/php7.0-fpm.sock;;
      }
}

I created a Hello World Controller file (Hello.php)

<?php 
defined('BASEPATH') OR exit('No direct script access allowed');
class Hello extends CI_Controller {

    public function __construct() {
         parent::__construct();
    }

    public function index(){
         $this->load->view('helloworld');
    }
 }

In my config.php file, I have the following:

$config['base_url'] = '';
$config['index_page'] = 'index.php';
$config['uri_protocol'] = 'REQUEST_URI';

I have tried the approaches here:

NGINX CodeIgniter Recipe: https://www.nginx.com/resources/wiki/start/topics/recipes/codeigniter/

CodeIgniter NGINX Rewrite Rules: http://www.farinspace.com/codeigniter-nginx-rewrite-rules/

Codeigniter nginx 404 error: Codeigniter nginx 404 error

Most of everything that I've read is based on PHP5 or an older version of CodeIgniter.

回答1:

Use this config in Nginx (Source):

 server {
            server_name domain.tld;

            root /your/web/root/path
            index index.html index.php;

            # set expiration of assets to MAX for caching
            location ~* \.(ico|css|js|gif|jpe?g|png)(\?[0-9]+)?$ {
                    expires max;
                    log_not_found off;
            }

            location / {
                    # Check if a file or directory index file exists, else route it to index.php.
                    try_files $uri $uri/ /index.php;
            }

            location ~* \.php$ {
                    fastcgi_pass 127.0.0.1:9000;
                    include fastcgi.conf;
            }
    }

Also you need to make a change in your php-fpm config. Edit this file:

/etc/php/7.0/fpm/pool.d/www.conf

Find this line:

listen = /run/php/php7.0-fpm.sock

Change to this:

listen = 127.0.0.1:9000

This changes should solve your issue.



回答2:

Here is the final working versions of the default, www.conf and config files. Another issue I found out I was having is that the controller and file name have to be the same capitalization. The controller class Hello needs to have the filename be Hello. Some of my controllers were not the same capitalization, this however was not the sole cause of the 404 as I tried that before fixing the default file.

/etc/nginx/sites-available/default:

server {
    server_name example.org;
    root /home/username/example/;
    index index.php index.html index.htm;

    location / {
        # Check if a file or directory index file exists, else route it to index.php
        try_files $uri $uri/ /index.php;

        # Handle PHP files
        location ~* \.php$ {
            root /home/username/example/ci;
            include fastcgi_params;
            fastcgi_pass 127.0.0.1:9000;
            include fastcgi.conf;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            try_files $uri $uri/ ci/index.php;
        }
    }

    # set expiration of assets to MAX for caching
    location ~* \.(ico|css|js|gif|jpe?g|png)(\?[0-9]+)?$ {
        expires max;
        log_not_found off;
    }
}

/etc/php/7.0/fpm/pool.d/www.conf:

listen = 127.0.0.1:9000

Finally, in my config file:

$config['base_url'] = 'http://example.org/ci/';

This configuration changes any CI links from

http://example.org/ci/Hello

to

http://example.org/Hello