Nginx and Codeigniter The Easy Way

⚠️  Archived — Originally published 2011

The $config['uri_protocol'] and $config['index_page'] approach shown here is from CodeIgniter 1.x/2.x. Modern CodeIgniter 4.x has an entirely different routing architecture and doesn't use these settings. The core Nginx pattern — try_files $uri $uri/ /index.php; with REQUEST_URI — is still valid, but the CI-specific instructions are obsolete. Content is preserved for historical reference only.

I personally don't use Codeigniter (was never much of a fan of PHP frameworks), however I had a client approach me with this issue so I decided to take a stab at it.

Now normally you would look for any existing .htaccess that comes with a script package and attempt to convert the rewrite rules. But seriously though, why do we really want to go thru all that fuss when we can simply use try files:

server {
 listen 80;
 server_name yourdomain.com www.yourdomain.com;
 root /path/to/your/website.com/;

 location / {
 try_files $uri $uri/ /index.php;
 }

 # For more information on the next two lines see http://kbeezie.com/nginx-configuration-examples/
 include php.conf;
 include drop.conf;
}

In a nutshell this should normally work... but why does it not?

Quite simple really; CodeIgniter by default uses PATH_INFO which is a really antiquated method of parsing the uri. As a result we must tell CI to use REQUEST_URI instead. To do this open up your config.php under /system/application/config/ and find the $config['uri_protocol'] and set it to this:

$config['uri_protocol'] = "REQUEST_URI";

You could also choose to use AUTO, but since we know we'll be dealing with request_uri, it is best to set it as such (though if you do run into problems, give AUTO a try).

If you have not already set the index page, you will want to blank it out in order for it to work with a rewrite method (request_uri, etc).

$config['index_page'] = "";

For known static files, take it a step further and capture common static requests so that you can cache accordingly:

	location ~* \.(ico|css|js|gif|jpe?g|png)$ {
		expires max;
		add_header Pragma public;
		add_header Cache-Control "public, must-revalidate, proxy-revalidate";
	}