William Yang
William Yang

Reputation: 769

CodeIgniter, NGINX inside folder not working

I have a stock CI application that runs on NGINX. There is no rewriting (I tried for 16 hours and couldn't not get it to work. It's either 500, 404, 403, or input file not specified), php files are passed to php-fpm.

Here's my default file under available-sites (Ubuntu 12.04, tried everything on CentOS and nothing worked):

server {

        listen   80;    

        root /usr/share/nginx/www/;
        index index.php index.html index.htm;
        server_name fish-in-a-bowl.net;

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

        error_page 404 /404.html;
        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
              root /usr/share/nginx/www/cloud;
        }

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        location ~ \.php$ {
                #fastcgi_pass 127.0.0.1:9000;
                # With php5-fpm:
                fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                include fastcgi_params;

        }
}

And config.php:

$config['base_url'] = 'http://fish-in-a-bowl.net/zz/';

$config['index_page'] = 'index.php';

//$config['index_page'] = '';

//$config['uri_protocol']   = 'PATH_INFO';
//$config['uri_protocol']   = 'QUERY_STRING';
//$config['uri_protocol']   = 'REQUEST_URI';
//$config['uri_protocol']   = 'DOCUMENT_URI';
//$config['uri_protocol']   = 'ORIG_PATH_INFO';

$config['uri_protocol'] = 'AUTO';

I've tried all the options available, but none worked. This node is on Digital Ocean, they have tutorials for setting up CI with Apache but not NGINX.

The default controller works, but when accessed via http://fish-in-a-bowl.net/zz/index.php/welcome I get No input file specified.

Help? This is SO strange.

SCREENSHOT >

enter image description here

Upvotes: 2

Views: 8453

Answers (6)

Arfan Mirza
Arfan Mirza

Reputation: 696

location /atri/ {
alias  /var/www/html/atri/;
try_files $uri $uri/ /atri/index.php;

location ~ \.php$ {
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_index   index.php;
    fastcgi_pass unix:/run/php/php7.0-fpm.sock;
    include /etc/nginx/fastcgi_params;
    fastcgi_param   SCRIPT_FILENAME $request_filename;
}

}

Upvotes: 0

Eko Dedy
Eko Dedy

Reputation: 409

try this

location ~ \.php($|/.+) { 

    fastcgi_pass 127.0.0.1:9000;

    fastcgi_split_path_info         ^(.+\.php)(/.*)$;
    fastcgi_param   SCRIPT_FILENAME $request_filename;
    include fastcgi_params;
}

Upvotes: 0

pythondjango
pythondjango

Reputation: 21

try this in your nginx setting

# enforce NO www
if ($host ~* ^www\.(.*))
{
    set $host_without_www $1;
    rewrite ^/(.*)$ $scheme://$host_without_www/$1 permanent;
}

# canonicalize codeigniter url end points
# if your default controller is something other than "welcome" you should change the following
if ($request_uri ~* ^(/welcome(/index)?|/index(.php)?)/?$)
{
    rewrite ^(.*)$ / permanent;
}

# removes trailing "index" from all controllers
if ($request_uri ~* index/?$)
{
    rewrite ^/(.*)/index/?$ /$1 permanent;
}

# removes trailing slashes (prevents SEO duplicate content issues)
if (!-d $request_filename)
{
    rewrite ^/(.+)/$ /$1 permanent;
}

# removes access to "system" folder, also allows a "System.php" controller
if ($request_uri ~* ^/system)
{
    rewrite ^/(.*)$ /index.php?/$1 last;
    break;
}

# unless the request is for a valid file (image, js, css, etc.), send to bootstrap
if (!-e $request_filename)
{
    rewrite ^/(.*)$ /index.php?/$1 last;
    break;
}

Upvotes: 1

drolex
drolex

Reputation: 5531

In your nginx service config change:

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

To

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

In your CI config.php set:

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

Upvotes: 1

Mohammad AbuShady
Mohammad AbuShady

Reputation: 42899

Just add a new location block for CI

location ~ /zz(?<myuri>.*) {
    root /path/to/root/zz;
    try_files $myuri $myuri/ /index.php$myuri$is_args$query_string;
}

That should do it all, test it and tell me how it goes.

Upvotes: 0

Ben Fortune
Ben Fortune

Reputation: 32127

Try the following, works a dream for me. Don't forget to change the fastcgi_pass, and backup your current config before you try it.

server
{
    listen   Server IP:80;
    server_name domain.name;

    access_log /var/log/nginx/access.log;

    root /path/to/www;

    index index.php index.html index.htm;

    # enforce www (exclude certain subdomains)
#   if ($host !~* ^(www|subdomain))
#   {
#       rewrite ^/(.*)$ $scheme://www.$host/$1 permanent;
#   }

    # enforce NO www
    if ($host ~* ^www\.(.*))
    {
        set $host_without_www $1;
        rewrite ^/(.*)$ $scheme://$host_without_www/$1 permanent;
    }

    # canonicalize codeigniter url end points
    # if your default controller is something other than "welcome" you should change the following
    if ($request_uri ~* ^(/welcome(/index)?|/index(.php)?)/?$)
    {
        rewrite ^(.*)$ / permanent;
    }

    # removes trailing "index" from all controllers
    if ($request_uri ~* index/?$)
    {
        rewrite ^/(.*)/index/?$ /$1 permanent;
    }

    # removes trailing slashes (prevents SEO duplicate content issues)
    if (!-d $request_filename)
    {
        rewrite ^/(.+)/$ /$1 permanent;
    }

    # removes access to "system" folder, also allows a "System.php" controller
    if ($request_uri ~* ^/system)
    {
        rewrite ^/(.*)$ /index.php?/$1 last;
        break;
    }

    # unless the request is for a valid file (image, js, css, etc.), send to bootstrap
    if (!-e $request_filename)
    {
        rewrite ^/(.*)$ /index.php?/$1 last;
        break;
    }

    # catch all
    error_page 404 /index.php;

    # use fastcgi for all php files
    location ~ \.php$
    {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /path/to/www/$fastcgi_script_name;
        include fastcgi_params;
    }

    # deny access to apache .htaccess files
    location ~ /\.ht
    {
        deny all;
    }
}

Upvotes: 0

Related Questions