FastCGI returning "No Input File" instead of 404

Hey everyone,

This seems like it would be easily solved, but I’m not sure how. I
just finished setting up PHP on my system. It runs fine. However, when
I browse to a page like
http://domain.com/this-php-script-does-not-exist.php” it returns “No
input file specified” instead of a normal nginx 404 error. I’m trying
to get it to display a normal 404 error instead. I’ve tried toggling
the fastcgi_intercept_errors, which seems like it would fix the
problem, however it didn’t work.

I’m running nginx stable, 0.6.37.

It seems that try_files would work somehow, but my understanding is
that try_files does not exist in 0.6.37?

My FastCGI config is below.

location ~ .*.php$ {
fastcgi_index index.php;
fastcgi_ignore_client_abort off;
fastcgi_intercept_errors off;
fastcgi_pass 127.0.0.1:9000;
fastcgi_read_timeout 10; # sec to wait for php-cgi to return data
fastcgi_param SCRIPT_FILENAME
/usr/local/www/web_root$fastcgi_script_name;
include /usr/local/etc/nginx/fastcgi_params;
}

Thank you for any and all help.

i was going to say this is the typical “check your SCRIPT_FILENAME”
but you already know that.

this is an interesting question. Igor would it be possible to
intercept this (or with a combination from php-fpm/the SAPI) to detect
these errors and present the 404 (or appropriate) handler defined?
either nginx default 404 or in the case of error_page being set using
that one (like a normal file-does-not-exist.html)

[root@web01 ~]# lynx -mime_header http://foo.com/script-doesnt-exist.php
HTTP/1.0 404 Not Found
Server: nginx
Content-Type: text/html; charset=utf-8
Vary: Accept-Encoding
Content-Encoding: gzip
Date: Thu, 21 May 2009 16:32:12 GMT
Content-Length: 45
Connection: close

it appears to throw a 404, but for some reason isn’t the normal nginx
404?

On Thu, May 21, 2009 at 11:25 PM, APseudoUtopia
[email protected] wrote:

I’m running nginx stable, 0.6.37.

It seems that try_files would work somehow, but my understanding is
that try_files does not exist in 0.6.37?

My FastCGI config is below.

location ~ .*.php$ {
if (!-f $request_filename) { return 404; break; }

On Thu, May 21, 2009 at 11:41:45PM +0700, Edho P Arief wrote:

problem, however it didn’t work.

I’m running nginx stable, 0.6.37.

It seems that try_files would work somehow, but my understanding is
that try_files does not exist in 0.6.37?

My FastCGI config is below.

location ~ .*.php$ {
if (!-f $request_filename) { return 404; break; }

NO! NO! NO!

On Thu, May 21, 2009 at 12:25:09PM -0400, APseudoUtopia wrote:

fastcgi_intercept_errors off;

  • fastcgi_intercept_errors off;
  • fastcgi_intercept_errors on;
  • error_page 404 /404.html;

fastcgi_pass 127.0.0.1:9000;
fastcgi_read_timeout 10; # sec to wait for php-cgi to return data
fastcgi_param SCRIPT_FILENAME /usr/local/www/web_root$fastcgi_script_name;
include /usr/local/etc/nginx/fastcgi_params;
}

location = /404.html {
root /path/to/the/page;
}

2009/5/22 Igor S. [email protected]:

the fastcgi_intercept_errors, which seems like it would fix the
 location ~ .*.php$ {
    try_files  $uri  /404.html;

    fastcgi_pass 127.0.0.1:9000;
    …

thanks. is there a way to return default 404?

Or is this the correct way?

location ~ .php${
try_files $uri @404;

}

location @404 { return 404; break; }

2009/5/21 Igor S. [email protected]:

the fastcgi_intercept_errors, which seems like it would fix the
 location ~ .*.php$ {
   fastcgi_intercept_errors off;
Igor S.
Igor Sysoev

Thanks a lot! Got it working perfectly. I appreciate the time and work
you put into the project. Thanks again!

On Fri, May 22, 2009 at 08:23:36AM +0700, Edho P Arief wrote:

to get it to display a normal 404 error instead. I’ve tried toggling

šlocation ~ .*.php$ {
š š š štry_files š$uri š/404.html;

š š š šfastcgi_pass 127.0.0.1:9000;
š š š š…

thanks. is there a way to return default 404?

Why do you want to return default 404 at all ? The default error
pages are last resort and should be customized on a good site.

Or is this the correct way?

You may use “if” or example below:

location ~ .php${
try_files $uri @404;

}

location @404 { return 404; break; }

You do not need “break” after “return”, because “return” breaks
execution
by itself.

2009/5/22 Igor S. [email protected]:

http://domain.com/this-php-script-does-not-exist.php” it returns "No
try_files exists in 0.6.36+.

}

location @404 { return 404; break; }

You do not need “break” after “return”, because “return” breaks execution
by itself.

I suspected it isn’t needed.
The reason would be to use whatever error_page that’s located in
server block so I only need to specify it once. (it works, right?)

On Thu, May 21, 2009 at 12:25:09PM -0400, APseudoUtopia wrote:

I’m running nginx stable, 0.6.37.

It seems that try_files would work somehow, but my understanding is
that try_files does not exist in 0.6.37?

try_files exists in 0.6.36+.
You may try this also:

location ~ .*.php$ {
try_files $uri /404.html;

fastcgi_pass 127.0.0.1:9000;

On Fri, May 22, 2009 at 04:31:08PM +0700, Edho P Arief wrote:

I browse to a page like

thanks. is there a way to return default 404?

server block so I only need to specify it once. (it works, right?)
server {
error_page 404 = /404.html;

location = /404.html {
}

location ~ \.php${
    try_files $uri /404.html;

    fastcgi_pass  ...
}