Search code examples
frameworksnginxphppathinfo

NGINX configuration. PHP frameworks with PATHINFO 404


I usually use apache and want to give NGINX a try.

I have installed it on my ubuntu dev machine and have a few different frameworks and sites set up and in development (codeigniter, symfony, laravel, etc).

The problem I'm getting is that only paths that end with .php work. If I try index.php/welcome/index it just 404s instead of loading index.php.

I have tried with cgi.fix_pathinfo set to 1 and 0.

Here is my current (of many tried) site config.

server {
listen   80; ## listen for ipv4; this line is default and implied
#listen   [::]:80 default_server ipv6only=on; ## listen for ipv6

root /my/path;
index index.php index.html;

# Make site accessible from http://localhost/
server_name localhost;

#error_page 404 /404.html;

# redirect server error pages to the static page /50x.html
#
#error_page 500 502 503 504 /50x.html;
#location = /50x.html {
#   root /usr/share/nginx/www;
#}

location ~ \.php$ {
    try_files $uri =404;

    # Fix for server variables that behave differently under nginx/php-fpm than typically expected
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    # Include the standard fastcgi_params file included with nginx
    include fastcgi_params;
    fastcgi_param  PATH_INFO        $fastcgi_path_info;
    fastcgi_index index.php;
    # Override the SCRIPT_FILENAME variable set by fastcgi_params
    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    # Pass to upstream PHP-FPM; This must match whatever you name your upstream connection
    fastcgi_pass unix:/var/run/php5-fpm.sock;
}


location / {
    # First attempt to serve request as file, then
    # as directory, then fall back to displaying a 404.
    try_files $uri $uri/ =404;
    # Uncomment to enable naxsi on this location
    # include /etc/nginx/naxsi.rules
}

# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
location ~ /\.ht {
    deny all;
}
}

Solution

  • I'd prefer to use the following nginx config structure. It's cleaner:

    location / {
      try_files $uri $uri/ @phpsite;
    }
    
    location @phpsite {
      include fastcgi_params;
      ... other fast_cgi directives
    }
    

    A bit more complex setup can be found in the popular silex project: http://silex.sensiolabs.org/doc/web_servers.html#nginx.

    I see 2 problems in the original config file:

    location ~ \.php$ {
        try_files $uri =404;
        ...
    }
    
    1. In regex '$' means matching at the end of the string. So it failed as stated in the comments by prodigitalson.
    2. That try_files directive inside the above fast_cgi location block should not be there because that location block is supposed to be handled by php alone. It's cleaner to remove that line.