Nginx, PATH_INFO, and url-rewriting: i must be missing something

I’m switching from Apache to Nginx/fcgi and I’m having a small issue
while attempting to setup the applications rewrite rules.

The code handles routes via the use of PATH_INFO, e.g.,
example.com/foo/bar/ will be routed to example.com/index.php/foo/bar/

I’ve modified the server configuration to pass PATH_INFO:

  location ~ \.php$ {
          include /etc/nginx/fastcgi_params;
          fastcgi_pass   127.0.0.1:9000;
          fastcgi_index  index.php;

          fastcgi_split_path_info ^(.+\.php)(.*)$;
          fastcgi_param SCRIPT_FILENAME
/var/www/public$fastcgi_script_name;
          fastcgi_param PATH_INFO $fastcgi_path_info;
          fastcgi_param PATH_TRANSLATED
$document_root$fastcgi_path_info;
  }

And the rewrite handler:

  location / {
          root   /var/www/public;
          index  index.html index.htm index.php;

          if (!-f $request_filename) {
            rewrite ^(.*)/(.*)$ /index.php/$2 break;
          }
        }

With ‘rewrite_log on’, the url’s appear to be routing properly:

    [error]: *2 open() "/var/www/public/index.php/test" failed (20: Not
a directory), client: 192.168.0.254, server: example.com, request: "GET
/test HTTP/1.1", host: "example.com", referrer:
"http://example.com/index.php"

However, it appears to be looking for the directory “test”. How can I
force it to request index.php, passing ‘/test’ to the script?

Posted at Nginx Forum:

On Tue, Jan 18, 2011 at 01:45:35PM -0500, uid_b wrote:

Hi there,

I’m switching from Apache to Nginx/fcgi and I’m having a small issue
while attempting to setup the applications rewrite rules.

The code handles routes via the use of PATH_INFO, e.g.,
example.com/foo/bar/ will be routed to example.com/index.php/foo/bar/

[code]
location ~ .php$ {

This location matches a url that ends in the four characters “.php”.

[/code]
With ‘rewrite_log on’, the url’s appear to be routing properly:

[code]
[error]: *2 open() “/var/www/public/index.php/test” failed (20: Not

This url is “/index.php/test”. Note that is does not end in the four
characters “.php”, and so will not be handled by the previous location
block.

However, it appears to be looking for the directory “test”. How can I
force it to request index.php, passing ‘/test’ to the script?

Change the “location” to match what you want it to match.

As a quick test, make it just match “php” to confirm that that works as
you want. And then tighten the config so that it won’t match things you
don’t want it to – perhaps “starts with /index.php/” is appropriate?

Good luck,

f

Francis D. removed_email_address@domain.invalid

Thanks for all the help guys! Everything is working great now :slight_smile:

Posted at Nginx Forum: