nginx code igniter remove index.php prefix

January 30, 2013


Remove the index.php prefix from your nginx code igniter instance.


  • In your main nginx conf file you define how php is called (unix socket or ip:port)
  • You will replace with whatever your domain name is
  • The proper logging path will be defined per your system as opposed to the location i have used


Example upstream in main nginx conf

        # Upstream to abstract backend connection(s) for PHP.
        upstream php {
                #using unix socket
                server unix:/tmp/php-fpm.sock;

Virtual Host to remove index.php

Here’s how i did it:

erver {
        root /opt/www/;

        access_log /opt/nginx/logs/foo-access.log;
        error_log /opt/nginx/logs/foo-error.log info;
        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 / {
             try_files $uri $uri/ @codei;

	location @codei {
        rewrite ^/[_0-9a-zA-Z-]+/(.*\.php)?$ /$1 last;
        rewrite .* /index.php last;

	location ~ \.php$ {
                try_files $uri =404;
                fastcgi_split_path_info ^(.+\.php)(.*)$;
                include fastcgi_params;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_param PATH_INFO $fastcgi_script_name;
                fastcgi_pass php;
                fastcgi_buffer_size 4K;
                fastcgi_buffers 64 4k;

CodeIgniter Specific Info

After this, make sure that your codeIgniter config.php contains the following information:

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

Still not working?

Try following the CodeIgniter