No Input File Specified

Cliff Wells cliff at develix.com
Mon Mar 5 02:34:28 UTC 2012


On Sun, 2012-03-04 at 20:11 -0500, Sageth wrote:
> Hi, I'm fairly new to Nginx (an Apache convert) and have run into an
> issue where my site works, but one particular POST function fails with
> "No Input File Specified."  The POST is a port of an old IPBv2 script to
> submit scores into a database via the URL:
> http://www.example.com/game/123/index.php?act=Arcade&do=newscore
> 
> I have verified permissions
> 
> In Apache, the RewriteRule was:
> RewriteRule ^game/(.*)/(.*)\.php$ index.php?act=Arcade&do=newscore [L]
> 
> In nginx, I have:
> rewrite ^/game/(.*)/(.*)\.php$ /index.php?act=Arcade&do=newscore last;
> 
> Here's my site's .conf (some info masked).  Can anyone help point me in
> a direction? I'm not sure what I'm missing and I've spent a solid 12
> hours on it, so would greatly appreciate any help.
> 
> server {
>         listen   80;
>         server_name 	www.example.com;
> 	root		/var/www/example;
>         location / {
> 		try_files $uri $uri/ @gss;
>         }
> 	location ~ \.php$ {
>   	  try_files $uri /index.php?$args =404;
> 	  if ($uri !~ "^/uploads/") {
> 		fastcgi_pass   unix:/var/run/php-fcgi.pid;
> 	  }
> 	location ~ /arcade/gamedata/(.*)$ {
> 	  alias /var/www/example/arcade/gamedata/$1;
> 	  internal;
> 	  break;
> 	}
> 	location @gss {
>           #Rewrite the games
> 	  rewrite ^/game/(.*)/(.*)\.php$ /index.php?act=Arcade&do=newscore
> last;
> 	  rewrite ^/play/index.php$ /index.php?act=Arcade&do=newscore last;
> 	  rewrite ^/game/(.*)/arcade/(.*)$ /arcade/$2 last;
> 	  rewrite ^/play/arcade/(.*)$ /arcade/$1 last;
> 	  rewrite ^/(.*).html$ /index.php?params=$1 last;
>          }
> }

I believe that what is happening is the \.php$ location is matched
first, so your rewrite rules are never called for PHP scripts.  See here
for the order Nginx processes locations:

http://nginx.org/en/docs/http/request_processing.html#simple_php_site_configuration

Specifically, the sentence "The first matching expression stops the
search and nginx will use this location."  The / location is used as a
fallback in case no specific regex location is matched.

Instead, something like this might work (untested):

location ~ \.php$ {
    rewrite ^/game/(.*)/(.*)\.php$ /index.php?act=Arcade&do=newscore break;
    rewrite ^/play/index.php$ /index.php?act=Arcade&do=newscore break;
    rewrite ^/(.*).html$ /index.php?params=$1 break;
    fastcgi_pass unix:/var/run/php-fcgi.pid;
}

location @gss {
    rewrite ^/game/(.*)/arcade/(.*)$ /arcade/$2 last;
    rewrite ^/play/arcade/(.*)$ /arcade/$1 last;
}

Regards,
Cliff




More information about the nginx mailing list