11

I hate configuring nginx. It's so complicated. How do I get PHP to work in my user dirs? Here's the relevant part of my nginx.conf:

    location ~ ^/~(.+?)(/.*)?$ {
        autoindex on;
        autoindex_exact_size off;
        alias /home/$1/public_html$2;

        location ~ \.php {
            include /etc/nginx/fastcgi.conf;
            fastcgi_intercept_errors on;
            fastcgi_pass  127.0.0.1:9000;
            fastcgi_index index.php;
        }
    }

This gives me the error: FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream in the nginx error log.

Here's my /etc/nginx/fastcgi.conf:

fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
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_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;
fastcgi_param  HTTPS              $https if_not_empty;

fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;

fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;

# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param  REDIRECT_STATUS    200;

I'm assuming nginx isn't resolving the script name correctly. I hate having to tell nginx where to look in my filesystem, writing custom regexes for what should be built-in (or at least standardized and documented) functionality.

nnyby
  • 298
  • 3
  • 5
  • 16

3 Answers3

11

Problem is that in your fastcgi.conf you define SCRIPT_FILENAME as $document_root$fastcgi_script_name; but you then use the alias direcive to set the path.

You should update your SCRIPT_FILENAME to use $request_filename

You can also go back to nested location if you prefer. If you still get this error afterwards then I have documented all the possibilities here: https://blog.martinfjordvald.com/no-input-file-specified-with-php-and-nginx/

Please check that as there can be multiple other causes.

Martin Fjordvald
  • 7,749
  • 1
  • 30
  • 35
6

When You define redirects, aliases and You do use fastcgi in the conf of your site in nginx You can try this to let them work:

Change:

location ~ \.php$ {
...
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
...
}


Into:

location ~ \.php$ {
...
fastcgi_param SCRIPT_FILENAME $request_filename;
fastcgi_param REQUEST_URI $uri?$args;
...
}

If this does not work try to use as said above without the REQUEST_URI, so it will be:

location ~ \.php$ {
...
fastcgi_param SCRIPT_FILENAME $request_filename;
...
}

Amtriorix
  • 161
  • 1
  • 2
2

Try using a separate location block for PHP scripts in the userdirs. This does not need to be nested.

location ~ ^/~([^/]+)/(.+\.php)$ {
    alias /home/$1/public_html/$2;
    include /etc/nginx/fastcgi.conf;
    fastcgi_intercept_errors on;
    fastcgi_pass  127.0.0.1:9000;
    fastcgi_index index.php;
}
Michael Hampton
  • 244,070
  • 43
  • 506
  • 972
  • Thanks for the suggestion! I'm a little closer now, but still getting the exact same error. – nnyby Aug 18 '12 at 21:13